25

所以我一直在尝试将 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 添加到该文件夹​​。

4

3 回答 3

19

简单的。只放路径,没有通配符。

<handlers>
  <add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</handlers>

这将匹配:

/api/{任何东西}

于 2013-04-04T04:04:02.457 回答
14

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>

Handler Mappings您可以在 IIS7 中的select下看到处理程序View Ordered List的顺序,它将列出加载处理程序的顺序,从顶部(第一个)到底部(最后一个)。

Web.config您的/api文件夹中可能需要一秒钟

<?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/现在看起来像这样:

处理程序列表

我可以肯定的是,其中的任何内容都/Content/将通过 StaticFileModule 提供。这里的技巧似乎是指定:inheritInChildApplications="false".

于 2011-05-10T11:30:41.610 回答
9

似乎 UrlRoutingModule-4.0 麻烦多于其价值。相反,我刚刚告诉 MVC3 忽略路由。这不是一个完美的解决方案,但在我有更好的方法之前,我必须坚持下去RegisterRoutes

routes.IgnoreRoute("api/{*route}");
于 2011-05-10T15:43:17.903 回答