URLRoutingModule-4.0
是一个泛用的处理程序,它位于您的Nancy处理程序之前。因此,在命中您的处理程序之前,它将先发挥作用。您可以按以下方式删除处理程序添加您自己的处理程序并将其重新添加回来:
<handlers>
<remove name="BlockViewHandler" />
<remove name="UrlRoutingModule-4.0" />
<add verb="*" path="robots.txt" name="robots" type="System.Web.StaticFileHandler"/>
... custom handlers here
<add name="Nancy" path="api/*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
... now add back UrlRoutingModule and BlockViewHandler
<add path="*" verb="*" name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" preCondition="managedHandler" />
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
在IIS7中,您可以在处理程序映射
下选择查看有序列表
,它将列出加载处理程序的顺序,从上(第一个)到下(最后一个)。
您可能需要在/api
文件夹中使用第二个Web.config
。
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<clear />
<add name="Nancy" path="*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</httpHandlers>
</system.web>
</configuration>
同样地,对于网站上的“/static”内容,我通常会这样做。我还没有找到如何规避需要第二个web.config的方法。
编辑:
当我不得不解决这个问题时,我也很难弄清楚这个问题,而且似乎我的记忆也没有为我服务。我没有在任何地方指定“path/*”处理程序,而是有这个:(仅指定简单的通配符/完全限定路径以绕过UrlRouting)
<location path="." inheritInChildApplications="false">
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="false" />
<handlers>
<remove name="BlockViewHandler" />
<remove name="UrlRoutingModule-4.0" />
<add verb="*" path="robots.txt" name="robots" type="System.Web.StaticFileHandler"/>
.. Some company handlers i can't list
<add path="*" verb="*" name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" preCondition="managedHandler" />
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</location>
然后在我的/Content/web.config
文件中设置如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<clear />
<add name="StaticFiles" path="*" verb="*" modules="StaticFileModule" resourceType="Either" requireAccess="None" />
</handlers>
<staticContent>
<clientCache cacheControlMaxAge ="31.00:00:00" cacheControlMode="UseMaxAge" />
</staticContent>
</system.webServer>
</configuration>
现在我的/Content/
处理程序列表如下:
这几乎可以确定,任何位于/Content/
中的内容都将通过StaticFileModule进行服务。关键在于指定:inheritInChildApplications="false"
。