Невозможно сопоставить HttpHandler с отображением подстановочного знака "путь / *" - PullRequest
25 голосов
/ 10 мая 2011

Итак, я пытался отобразить модуль 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 / {что-нибудь}, он просто возвращает 404.

Я уверен, что я просто "делаю это неправильно (тм)", но любая помощь будет принята.Примечание: я также попробовал несколько других конфигураций, включая использование тега и создание папки / api и добавление web.config в эту папку с полным подстановочным знаком.

Ответы [ 3 ]

18 голосов
/ 04 апреля 2013

Simple.Просто введите путь без подстановочных знаков.

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

Это будет соответствовать:

/ api / {что-нибудь}

14 голосов
/ 10 мая 2011

URLRoutingModule-4.0 - это обработчик всех вызовов, перечисленных перед вашим обработчиком Нэнси.Таким образом, он вступит в игру еще до того, как ваш обработчик попадет в цель.Вы можете удалить обработчики, добавить свои и добавить их обратно следующим образом:

<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 в разделе Handler Mappings 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>

Точно так же, это то, что я обычно делаю для«/ статический» контент на сайтах.Я не нашел, как обойти потребность в секундах 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/ теперь выглядит следующим образом:

Handler list

Это примерно настолько, насколько я могувсе, что в /Content/ будет обслуживаться через StaticFileModule.Уловка здесь, кажется, указывает: inheritInChildApplications="false".

9 голосов
/ 10 мая 2011

Кажется, что UrlRoutingModule-4.0 - больше проблем, чем оно того стоит.Вместо этого я только что сказал MVC3 игнорировать маршруты.Не идеальное решение, но пока у меня не появится что-то, что работает лучше, мне придется придерживаться этого в RegisterRoutes:

routes.IgnoreRoute("api/{*route}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...