Asp.net 无法将HttpHandler映射到";路径/*";通配符映射
所以我一直在尝试将http模块映射到MVC3站点的子路径。据我所知,它应该很简单,但它一直不起作用。模块的设置如下所示:Asp.net 无法将HttpHandler映射到";路径/*";通配符映射,asp.net,iis-7,httphandler,webdev.webserver,nancy,Asp.net,Iis 7,Httphandler,Webdev.webserver,Nancy,所以我一直在尝试将http模块映射到MVC3站点的子路径。据我所知,它应该很简单,但它一直不起作用。模块的设置如下所示: <handlers> <add name="Nancy" path="api/*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" /> </handlers> iis6也有一个匹配的部分,所以我可以在webdev.
<handlers>
<add name="Nancy" path="api/*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</handlers>
iis6也有一个匹配的部分,所以我可以在webdev.webserver下运行它。但是,在测试部署到本地iis7(在Win7下)和webdev.webserver时,实际上只有/api调用处理程序。如果我调用/api/{anywhere},它只返回404
我确信我只是“做错了(tm)”,但任何帮助都将不胜感激
注意:我还尝试了一些其他配置,包括使用标记和创建/api文件夹,以及使用完整通配符将web.config添加到该文件夹。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>
同样,这也是我通常为网站上的“/静态”内容所做的。我还没有发现如何绕过对seconds web.config的需求
编辑
当我不得不这么做的时候,我很难弄明白这一点,而且我的记忆力似乎不太好。我没有在任何地方指定路径/*
处理程序,而是:
(仅指定简单通配符/完全限定路径以绕过UrlRouting)
我的/Content/
处理程序列表现在如下所示:
这几乎是我可以确定的,
/Content/
中的任何内容都将通过StaticFileModule提供。这里的诀窍似乎是指定:inheritinchildaplications=“false”
似乎UrlRoutingModule-4.0麻烦太多了。相反,我只是告诉MVC3忽略路由。这不是一个完美的解决方案,但在我找到更好的解决方案之前,我必须在注册表项中坚持这一点:
routes.IgnoreRoute("api/{*route}");
简单。只需输入路径,没有通配符
这将匹配:
/api/{anything}
我尝试了很多组合,但在IIS6或IIS7下似乎不起作用。同样的结果。我在/api文件夹和主Web.config中的第二个Web.config下再次尝试了这一点,非常接近我所需要的。但正如它被命名为UrlRoutingModule-4.0一样,它是一个模块而不是一个处理程序。我已使用适合我的正确web.config编辑了您的答案。谢谢你的帮助!事实上,即使有这些变化,这也不太管用。我摆弄它,只有完全禁用MVC路由才能让它工作,这并不理想。如果您说您已经将其用于静态文件路由,请再次检查您在web.configs中所做的工作。好的,既然它对您有效,我将暂时将其标记为答案。我现在对下面的解决方案没意见,再处理这个问题简直是疯了。非常感谢你的帮助,好家伙。我已经试了几个小时了。在子目录上使用不同的web.config的想法是完美的。谢谢在功能上似乎与IIS6的adsutil.vbs集/W3SVC/105364569/root/Content/ScriptMaps“”相当,似乎运行良好。你发现这样做有什么缺点吗?到目前为止还没有,已经在生产中使用了很长一段时间。你可能还想添加routes.IgnoreRoute(“\u Nancy/{*route}”);如果您正在使用nancy v0.10+启用diagnostics。有趣的是,我不再做太多的.NET工作,因此我可能没有时间验证这一点。如果有其他人可以的话,我很乐意把它标记为正确答案。我得说实话,这看起来几乎。。。太容易了。我必须相信我会尝试的。@ChrisNicola我在我所有的httpHandlersforAPI中都使用了这个。很好地工作。在我看来,这是最好的答案。由于某些原因,静态文件处理程序无法工作。此处理程序需要接受答案中所示的方法。这对我来说确实有效-从一个处理程序(我动态调整大小/流)提供JPG,从第二个处理程序提供js/png/etc。
<location path="." inheritInChildApplications="false">
<system.webServer>
<!--
ml: in .NET 4.0 its now safe to remove from the modules section.
Make sure you have a *. mapping to a ExtensionLessUrl hanlder in IIS
this should improve performance a tad albeit neglectable.
see: http://blogs.msdn.com/b/tmarq/archive/2010/04/01/asp-net-4-0-enables-routing-of-extensionless-urls-without-impacting-static-requests.aspx
-->
<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>
<?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>
routes.IgnoreRoute("api/{*route}");