我在VS2013中有一个MVC5应用程序。我需要在根Web.config中添加一些处理程序。这没有虚拟目录,但是当我指定虚拟目录时,IIS Express会失败。
这很容易在VS2013中重现:
修改顶级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只使用名称运行应用程序并避免重复键错误?
答案 0 :(得分:0)
您必须始终牢记,同一网站下的ASP.NET应用程序会继承父级的配置。这意味着,WebTest应用程序将自己拥有一个“Static for png”,并从其父级(站点根应用程序)获得另一个“Static for png”。
因此,正如@thehaunt指出的那样,你必须添加一个标签以避免重复。