だから私は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の追加など、他のいくつかの構成も試しました。
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/
のハンドラーリストは次のようになります。
/Content/
で何でもできるので、StaticFileModuleを介して提供されます。ここでのトリックは、inheritInChildApplications="false"
を指定しているようです。
シンプル。パスを入れるだけで、ワイルドカードは不要です。
<handlers>
<add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</handlers>
これは一致します:
/ api/{anything}
UrlRoutingModule-4.0は、その価値よりも問題が多いようです。代わりに、ルートを無視するようにMVC3に指示しました。完璧な解決策ではありませんが、うまく機能するものができるまで、RegisterRoutes
でこれに固執する必要があります。
routes.IgnoreRoute("api/{*route}");