12

RouteExistingFilesがどのように機能するかを理解しようとしています。そこで、新しいMVC 3インターネットプロジェクトを作成し(MVC 4は同じように動作します)、HTMLPage.htmlファイルをプロジェクトのContentフォルダーに配置しました。ここで、Global.Asaxファイルに移動し、RegisterRoutes関数を編集して、次のようにしました。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = true; //Look for routes before looking if a static file exists

    routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults
            );
    }

「Content」コントローラーがなく、リクエストがデフォルトのパターンに確実にヒットするため、localhost:XXXX / Content/HTMLPage.htmlをリクエストするとエラーが発生するはずです。しかし、代わりにHTMLPageが表示されています。私はここで何が間違っているのですか?

更新:私はあきらめなければならないと思います。このようなルートを追加している場合でも、次のようになります。

routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"});

それでもHTMLPageのコンテンツが表示されます。〜/ Content / HTMLPageのようなURLをリクエストすると、期待どおりにインデックスページが表示されますが、.htmlや.txtのようなファイル拡張子を追加すると、コンテンツが表示されます(ファイルが存在しない場合は404エラー) 。誰かがVS2012でこれをチェックできるなら、あなたが得ている結果を私に知らせてください。ありがとうございました。

4

3 に答える 3

19

静的ファイルのルーティングを有効にするには、次の手順を実行する必要があります。

RouteConfig.cs で、既存のファイルのルーティングを有効にします

routes.RouteExistingFiles = true;

パスのルートを追加します (特殊なパスが一般化されたパスの上にあることを確認してください)

routes.MapRoute(
            name: "staticFileRoute",
            url: "Public/{file}/",
            defaults: new { controller = "Home", action = "SomeAction" }
        );

次に、アプリケーションを構成して、静的ファイルの要求が「TransferRequestHandler」によって処理されるようにします。system.webServer>handlers の下の Webconfig で、次のエントリを追加します。

<add name="MyCustomUrlHandler2" path="Public/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

「パス」の値は、要件に応じて、より一般的または具体的にすることができます。しかし、私はそれが必要に応じて常に非常に具体的であることを好みます。非常に一般的なものにしておくと、.js ファイルや css ファイルなど、他のサイト固有のリソースの提供がブロックされます。たとえば、上記が path="*" として設定されている場合、ページがどのように表示されるかを担当する (コンテンツ フォルダー内の) css の要求もコントローラーのアクションで終了します。あなたが好きではない何か。

于 2014-02-12T10:12:20.280 に答える
6

Visual Studio 2012 は IIS Express を使用します。ディスク ファイルの要求が MVC ルーティング システムに渡される前に、要求を傍受しないように IIS に指示する必要があります。preCondition構成ファイルで属性を空の文字列に設定する必要があります。

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" 
     preCondition="" />

Win7/8 では、次のパスに構成ファイルがあります。%userprofile%\Documents\IISExpress\config\applicationhost.config

于 2013-06-15T12:04:41.760 に答える
5

ファイルのRouteExistingFilesルートがない場合、ファイルが表示されないようにすることはできません。ファイルが存在するかどうかを確認する前に、ルートを確認するだけです。一致するルートがない場合は、一致するファイルがあるかどうかを引き続き確認します。

于 2012-12-16T22:03:40.573 に答える