虚拟目录中的Web.config未覆盖父网站的Web.config。

5
我有一个网站,其中包含一个虚拟目录,该目录还包括一个网站。当我尝试从虚拟目录启动页面时,我收到了一个IIS 7.5错误,指出连接字符串中的名称已经在集合中存在。在将域用户添加为应用程序池中的标识之前,这不是问题。有人知道为什么会发生这种情况吗?我原本以为子级应用程序的web.config默认会覆盖父级的设置。而且,这曾经是可以正常工作的,直到我添加了自定义标识。

页面上的错误信息是“解析器错误消息:条目'dbname'已经被添加。”其中dbname在两个连接字符串中都有(即父级和虚拟目录)。我无法删除其中一个连接字符串,因为虚拟目录仅用于测试目的,在生产环境中它将作为自己的网站运行。
2个回答

7

子web.config不会覆盖父级web.config,无论是哪个应用程序。所有的web.config都会堆叠到主应用程序的根目录。为了使子应用程序文件夹能够使用已经在使用中的连接字符串键,必须首先删除它或清除所有连接字符串。如果您希望这是一个真正独立的应用程序作为子项,请将其添加到您的连接字符串中:

<connectionStrings>
    <clear />
    <your connection string>
<connectionStrings>

如果您只想移除单个连接字符串,请使用以下方法:

<remove key="yourConnectionStringName" />

1
你有任何想法为什么以前没有发生过这种情况吗?我多年来一直像这样设置两个应用程序,从未遇到冲突。此外,我无法在子应用程序中排除连接字符串,因为通常在服务器的根级别使用它。 - u84six
@u84six:它不会从根级别删除它,它只会从该级别的应用程序(以及该应用程序的任何子级)中删除它。不,我真的不能说为什么突然出现这种情况。您所描述的更改在此冲突中没有作用。 - Joel Etherton
@MystereMan:那不对。虚拟目录将被视为任何普通子目录,并且web.config文件将继续堆叠和继承。http://msdn.microsoft.com/en-us/library/ms178685(v=vs.100).aspx - Joel Etherton
@JoelEtherton 我该如何在IIS 6中实现这一点?我的网站正在运行SharePoint(2007)。我在此网站下的虚拟目录中创建了一个应用程序,由其自己的应用程序池管理。然而,我遇到了SharePoint配置和此应用程序之间的冲突。请参见我在Server Fault上发布的此问题。目标是使虚拟目录中的此应用程序完全独立于SharePoint的web.config。 - Web User
@WebUser:我已经在那个问题上发表了评论。但是,关于这个问题,如果你想让它们真正解耦,你必须查看SharePoint的web.config,并确保每个在SharePoint中引用的部分都使用<clear />取消引用。这样做的危险在于,你也会消除machine.config中指定的任何内容,因此你必须在子web.config中复制这些条目。然而,从你问题的症状来看,web.config不太可能是罪魁祸首。 - Joel Etherton
@JoelEtherton,是的,使用<clear />可能会冒失丢失machine.config提供的太多内容。在这种情况下,<remove />是否适用?我的意思是,我能否删除某个部分,然后将其添加回ASP.NET应用程序的web.config中? - Web User

0

@u84six,

今天发生了这件事情。我有一些网站和 Web 服务在同一个根网站中。根网站是默认的 IIS 网站(Default Web Site),我想它指向的是 C:\Inetpub\wwwroot。这是一个开发环境。

在我阅读了this answer之后,我发现我的一个 Web 服务是根网站(仍然不确定是什么改变了它...也许是 Visual Studio,在从2010迁移到2012后)。该 Web 服务正在使用冲突的 connectionString。我将路径更改回 C:\Inetpub\wwwroot\,一切恢复正常。

也许你遇到了类似的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接