无法将HttpHandler映射到“ path / *”通配符映射

|| 因此,我一直试图将http模块映射到MVC3站点的子路径。据我了解,它应该很简单,但是一直没有奏效。该模块的设置如下:
<handlers>
  <add name=\"Nancy\" path=\"api/*\" verb=\"*\" type=\"Nancy.Hosting.Aspnet.NancyHttpRequestHandler\" allowPathInfo=\"true\" />
</handlers>
iis6的匹配部分也在那里,因此我可以在webdev.webserver下运行它。但是,无论测试部署到我的本地iis7(在Win7下)还是使用webdev.webserver进行测试,只有/ api实际上会调用该处理程序。如果我调用/ api / {anything},它只会返回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>
您可以在IIS7中的“ 3”下选择“ 4”来查看处理程序顺序,它将列出从顶部(第一个)到底部(最后)加载处理程序的顺序。 您的
/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>
        <!--
        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>
然后在我的
/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/
处理程序列表现在看起来像这样: 可以肯定的是,ѭ12中的任何内容都将通过StaticFileModule提供。这里的技巧似乎是在指定:
inheritInChildApplications=\"false\"
。     
简单。只需输入路径,没有通配符。
<handlers>
  <add name=\"Nancy\" path=\"api\" verb=\"*\" type=\"Nancy.Hosting.Aspnet.NancyHttpRequestHandler\" allowPathInfo=\"true\" />
</handlers>
这将匹配:   / api / {任何内容}     
似乎UrlRoutingModule-4.0比它值得的麻烦更多。相反,我只是告诉MVC3忽略路由。这不是一个完美的解决方案,但在找到更好的解决方案之前,我必须在ѭ16stick中坚持这样做:
routes.IgnoreRoute(\"api/{*route}\");
    

要回复问题请先登录注册