无法添加重复的集合条目,类型为“add”,唯一键属性“name”设置为“aspNetCore”。

40

我最近将我的ASP.NET Core应用程序发布到了我的主机上。 我遇到了HTTP错误500.19。

IIS 8.5指出问题是:-

"无法添加类型为'add',具有唯一键属性'name'设置为'aspNetCore'的重复集合条目"

它还在我的system.webServer配置中突出显示了这个关键的add行:

<handlers>
  <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule"      
</handlers>

我不太确定该怎么做。看起来似乎有一个重复的实例,所以我尝试将其重命名,但它仍然要求再次添加它?

这是我的web.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <!--
  Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->

  <system.webServer>
  <handlers>
    <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
  </handlers>
  <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>

<system.net>
<defaultProxy useDefaultCredentials="true" >
</defaultProxy>
</system.net>
</configuration>

你能否发布完整的错误日志,也许在控制台中运行时会有更多详细信息。在ISS中你设置了什么URL绑定? - agua from mars
12
你尝试过在 add 前添加 <remove name="aspNetCore" /> 吗? - DavidG
1
如果你把它叫做 aspNetCoreHandler 会怎么样? - agua from mars
你也遇到了同样的问题吗?不知道你有没有找到解决方案? - CodeCowboyOrg
我尝试不在网站下添加应用程序,并更改网站本身的appPool,现在我得到了与我在添加<remove name="aspNetCore" />之前得到的相同的错误,所以这可能有所帮助。 - Austin_Anderson
11个回答

31

上面的答案对我没用,但 DavidG 的评论确实解决了我的问题,所以我要将其作为答案发布,以防它能帮助其他人。

对于我来说,我没有将其运行为子应用程序,并且一个一直正常工作了一年的项目突然出现了这个问题。仍然不确定发生了什么变化。当我注释或删除了 <add name="aspNetCore".../> 时,错误仍然存在,然后该行会自动重新添加。

要解决这个问题,我在配置文件中添加了 <remove name="aspNetCore" />,就在 <add name="aspNetCore"... /> 条目的上方,然后事情又开始正常运作了。


4
这是Voodoo编程的一个很好的例子。它能运行,但为什么呢,真是鬼扯。 - Boiethios

17

如果你想继续使用IIS EXPRESS,请前往存放.sln文件的根目录。

去删除.vs\config\applicationhost.config文件,或者将其保存在临时位置(如果里面有重要内容)。

关闭/重新打开VS Studio,再次运行即可。

如果需要从保存的applicationhost.config中添加一些内容,只需比较这两个文件即可,但我不知道那里面可能会有什么内容。


2
这应该是正确的答案。我的配置文件中有一个重复的条目,在删除该文件后,它创建了一个新文件,没有重复项,然后它就可以正常工作了。谢谢@SilentTremor。 - deanwilliammills
它起作用了。但是我也删除了 .vs{projectName}\config\applicationhost.config 文件。 - Murat Özbayraktar
这对我有用。我还发现.vs文件夹被Rolsyn锁定了(使用Process Explorer | Find | Find Handle or DLL找到)。必须先杀掉它才能删除该文件夹。 - Tony O'Hagan
我也认为这应该是正确的解决方案。至少在我的情况下,IIS和Express突然停止工作了,而我似乎什么也没有改变。清除以前的applicationhost.config文件解决了问题。 - arturn
@SilentTremor,我真的很想知道你是如何发现这个文件引起了问题的。 - Tejaswi Pandava
显示剩余2条评论

10

很不幸,所有建议的解决方案都对我无效。奇迹般地,我发现我的 applicationhost.config 文件已被修改,导致当我浏览我的 .NET Core 网站应用程序中的特定页面时出现“无法添加重复集合条目”错误。

applicationhost.config<sites> 标记下,我有以下内容:

<site name="MyWebsite" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="C:\Users\___\solutionname\MyWebsite" />
    </application>
    <application path="/SomePage" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="C:\Users\___\solutionname\MyWebsite" />
    </application>
    <bindings>
        <binding protocol="https" bindingInformation="*:12345:localhost" />
    </bindings>
</site>

当我访问页面“/SomePage”时,出现了500.19 HTTP错误。您可以看到,由于某种原因,这个特定页面存在一个独立的<application>标签。我不知道为什么会这样。

我删除了位于“/SomePage”路径下的整个<application>标签,然后一切都开始正常工作了。


2
谢谢,这也解决了我的问题。我采取的步骤是想让我的应用程序在某个页面下以调试(F5)方式打开,我在项目设置中添加了该页面,但这导致了上述应用程序配置文件中的条目,从而破坏了我的应用程序。 - Starjumper Tech SL
2
@System24Tech 我这里也遇到了完全相同的问题;我在服务器部分更改了“项目URL”,而不是在启动操作部分更改“特定页面”。唉!盲目地点击,没有考虑自己在做什么... - Urk
也许添加一个注释,说明可以在 {projectpath}/.vs/{project}/config/applicationhost.config 找到此内容。 - lemonskunnk

6

我在使用vs 2017时遇到了这个问题,该项目之前没有修改过web.config文件也能正常运行。通过查看这些帖子,我意识到可能是IIS Express的问题,我只需删除.vs文件夹并重新启动vs即可解决。


3

我遇到了同样的问题,在我的情况下,注释掉这一行

<add name="aspNetCore"...

解决了问题并提出了“为什么没有AspNetCoreModule也能正常工作”的问题。 在我这种情况下,问题是我将站点添加为默认网站中的子应用程序,并且它位于wwwroot文件夹中。我认为配置自动由默认网站接管,并应用于所有子应用程序站点。 此链接有所帮助 因此,解决方案是将其移动为另一个端口上的单独站点。

解决了我的问题。谢谢! - hubert17

0

我刚刚遇到了这个问题,结果发现我在网站属性的调试设置中更改了应用程序 URL,以加载特定页面(错误但发生了)。

enter image description here

在IIS中,它会自动在测试域下创建一个名为About的新应用程序(在这种情况下)。
删除域下的恶意IIS应用程序可以解决问题,因为在导航到页面时它不会尝试重新加载相同的web.config。

0

如果您在运行网站时使用IIS,请检查应用程序池是否附加了“重复”的应用程序。

我在调试IIS中的网站时遇到了相同的问题。在排除故障时,我发现我的网站的应用程序池显示连接了2个应用程序。我检查了每个站点,以确保我没有意外地将其中一个分配给了同一应用程序池,但它们都是正确的。所以我删除了IIS中的网站,并检查了应用程序池,然后显示0个应用程序。我在IIS中重新创建了网站,将其附加到应用程序池,然后仅显示1个应用程序。重新启动网站,然后它正常工作。

不确定如何将虚幻的应用程序附加到我的应用程序池,但这就是在我的情况下导致重复aspNetCore密钥的原因。


0

这个错误是因为ASP.NET Core中有一个名为".vs\config\applicationhost.config"的根文件。 它最初有67个键。您可以在配置编辑器中自己查看。 Where to find the ApplicationHost.config

这个名为".vs\config\applicationhost.config"的文件具有Web.config所需的默认设置,其中之一就是该处理程序。 您也可以在此处查看。 Key aspNetCore

问题在于该文件具有该处理程序,而您发布的内容将继承该处理程序。

您有两个解决方案,注释掉已发布的web.config行或从".vs\config\applicationhost.config"中删除该处理程序


0
在我的情况下,问题是由于在我的 Web 项目的 Debug 选项卡中放置了一个路径,以便应用程序会打开到特定页面。这会导致文件 .vs\config\applicationhost.config 中出现两个静默添加,类似于 eightx2 观察到的那个。
在:
<add name="api AppPool" managedRuntimeVersion="" />

在:

<application path="/blah" applicationPool="api AppPool">
<virtualDirectory path="/" physicalPath="your-path\src\your-proj" />
</application>

在相似的条目已经存在的地方。这是问题的根源。

不幸的是,错误信息完全误导人。

解决方案是重命名applicationhost.config,重新启动VS,并让其重建文件。这就是为什么Ricardo删除整个.vs文件夹的解决方案也有效。


0

我有一个包含多个子应用程序的父Web应用程序。

以下是对我有效的方法:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments="<pathToDll>" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
    </system.webServer>
  </location>
</configuration>

基本上,将父网站的system.webServer元素用location元素包装起来,并设置inheritInChildApplications:<location path="." inheritInChildApplications="false">

然后子网站可以保持不变,您无需在每个子网站的web.config中添加<remove name="aspNetCore" />

请注意,这是在项目文件中:

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />

在发布过程中,它会被更改为以下内容:

<aspNetCore processPath="dotnet" arguments="<pathToDll>" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />

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