7

デフォルトの ASP.NET MVC 3 プロジェクト テンプレートには、次のIgnoreRouteディレクティブが含まれています。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

複数のプロジェクトがこの行 ( StackExchange の DataExplorerを含む) を代わりに次のように変更するのを見てきました。

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});

この後者のバージョンが適切であるのに、デフォルトルートを無視するのが適切ではない理由を、.axd誰がどのシナリオで、または一般的に説明できますか? またはその逆に、なぜこの後者のバージョンを使用せず、代わりにデフォルトのままにすることを選択するのでしょうか?

IgnoreRoute私は構文を完全には理解していないことを認めなければなりません。また、この件に関する MSDN ドキュメントはかなり簡潔です。

4

2 に答える 2

6

Phil Haack のブログに説明があります: Make Routing Ignore Requests For A File Extension

Phil の言葉を引用すると、基本的な考え方は次のとおりです。

これに対する 1 つの解決策は、適切な無視ルートを追加して、ルーティングがこれらの要求を無視する必要があることを示すことです。残念ながら、次のようなことはできません。

{*path}.aspx/{*pathinfo}

キャッチオール ルートは 1 つしか許可されておらず、URL の最後に配置する必要があります。ただし、次のアプローチを取ることができます....

私がここで行っているのは、すべての URL をこれらのルートにマップし、制約辞書を介して無視するルートを制限するという、Eilon が教えてくれた手法です。したがって、この場合、これらのルートは、favicon.ico のすべての要求 (ディレクトリに関係なく) と .aspx ファイルの要求に一致します (したがって、無視されます)。これらの要求を無視するようルーティングに指示したので、これらの要求の通常の ASP.NET 処理が行われます。

于 2011-08-22T19:50:21.493 に答える
4

IgnoreRoute元の投稿からの2つの呼び出しの違いは次のとおりです。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

これは、/ ScriptManager.axd/Foo.axd/bar/baz.aspxなどのリソースへのリクエストと一致しますが、 / foo / bar/Bazなどのサイトのルートの下にある*.axdリソースへのリクエストとは一致しません。 axd

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});

この呼び出しでは、正規表現を使用して、/ foo / bar/Baz.axdなどのサイトの任意のレベルにある任意の*.axdリソースにリクエストを照合ます。したがって、サイトのルートの下にあるaxdリソースを参照する場合は、最初の呼び出しよりもこの呼び出しの方が適しています。

正規表現を分解する.*と、先頭のが0個以上の任意の文字に一致します。\.axdリテラル文字列と一致し、".axd"オプション(/.*)?でスラッシュとそれに続く0個以上の任意の文字と一致します。

URLパターンのは、パスの1つのセクションだけでなく、パス全体がスキャンされることを保証します*。は、パスの一致した部分に付けられた単なる任意のラベルであり、この場合はパス全体になります。ルートを無視するこの方法を使用すると、特定のファイル拡張子のルートを効果的に無視できます。* .aspx、*。asmxなどのルートを無視するために、この呼び出しを簡単にコピーしていくつかの変更を加えることができます。{*allaxd}allaxd

ルーティングの詳細なドキュメントについては、次のMSDNページを強くお勧めします。

于 2013-03-07T13:29:30.703 に答える