web-dev-qa-db-ja.com

HttpHandlerを「path / *」ワイルドカードマッピングにマップできません

だから私はMVC3サイトのサブパスにhttpモジュールをマップしようとしています。それは私が理解しているようにかなり単純なはずですが、機能していません。モジュールは次のように設定されています:

<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の追加など、他のいくつかの構成も試しました。

25
Chris Nicola

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フォルダに2つ目の/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"を指定しているようです。

14
Martijn Laarman

シンプル。パスを入れるだけで、ワイルドカードは不要です。

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

これは一致します:

/ api/{anything}

18
ThinkingStiff

UrlRoutingModule-4.0は、その価値よりも問題が多いようです。代わりに、ルートを無視するようにMVC3に指示しました。完璧な解決策ではありませんが、うまく機能するものができるまで、RegisterRoutesでこれに固執する必要があります。

routes.IgnoreRoute("api/{*route}");
9
Chris Nicola