指定虚拟路径时,添加webServer处理程序会导致IISExpress中出现重复键错误

时间:2015-03-19 16:19:16

标签: asp.net visual-studio-2013 web-config iis-express handlers

我在VS2013中有一个MVC5应用程序。我需要在根Web.config中添加一些处理程序。这没有虚拟目录,但是当我指定虚拟目录时,IIS Express会失败。

这很容易在VS2013中重现:

  • 创建一个新的ASP.NET Web应用程序。选择MVC并且不进行身份验证
  • 修改顶级Web.config。在关闭配置标记之前的底部添加以下行:

      <system.webServer>
        <handlers>
          <add verb="GET" path="*.png" name="Static for png" 
                                       type="System.Web.StaticFileHandler" />
        </handlers>
      </system.webServer>
    </configuration>
    
  • 应用程序运行正常。现在,转到项目属性,&#34; Web&#34;选项卡,并添加一个应用程序名称,如&#34; WebTest&#34;到项目网址。单击&#34;创建虚拟目录&#34;按钮并确认,以便VS让你保存。

  • 构建并运行

您收到错误500.19 - 无法添加类型&#39;添加&#39;的重复收集条目具有唯一键属性&#39; name&#39;设置为&#39;静态用于png&#39;

IIS Express正在两个URL上运行应用程序,一个是名称,另一个是没有。没有名称(http://localhost:52065/)的URL首先出现并正常工作;名字的那个是第二个并且有错误。顺便说一句,VS2010只是用名称运行应用程序,这很好。

MyDocuments\IISExpress\config\applicationhost.config文件中,我看到了应用程序的两个条目,两个条目都指向同一个物理目录:

<site name="WebTest" id="3">
  <application path="/" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="C:\_Dev\WebTest\WebTest" />
  </application>
  <application path="/WebTest" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="C:\_Dev\WebTest\WebTest" />
  </application>

我不明白为什么需要两个条目。我试过了:

  • 删除第一个应用程序条目。这导致无法识别 配置路径错误。
  • 复制整个解决方案,并将第一个条目指向它。这会得到相同的重复错误。

某些上下文:我需要静态处理程序,因为此应用程序必须构建为独立dll的集合。我将内容嵌入到dll中 在构建时,然后使用VirtualPathProvider拦截每个路径请求并从dll返回流。我发现这只有在静态文件处理程序位于根Web.config中时才有效。否则我的VPP没有收到请求。

dll位于项目根目录下的Plugin目录中。将配置文件放在那里也没有帮助。

我错过了什么?有没有办法让IIS Express只使用名称运行应用程序并避免重复键错误?

1 个答案:

答案 0 :(得分:0)

您必须始终牢记,同一网站下的ASP.NET应用程序会继承父级的配置。这意味着,WebTest应用程序将自己拥有一个“Static for png”,并从其父级(站点根应用程序)获得另一个“Static for png”。

因此,正如@thehaunt指出的那样,你必须添加一个标签以避免重复。