2012-12-16 4 views
11

RouteExistingFilesの仕組みを理解しようとしています。 私は新しいMVC 3インターネットプロジェクトを作成しました(MVC 4は同じように動作します)。プロジェクトのコンテンツフォルダにHTMLPage.htmlファイルを配置します。 は、今私はGlobal.asaxファイルに行って、それは次のようになりますので、RegisterRoutes機能を編集した:私はローカルホストを要求していたときにASP.NET MVC 3:RouteExistingFiles = trueは無効です。

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 
      ); 
    } 

今では私にエラーを与える必要があります:XXXX /コンテンツ/ HTMLPage.htmlを「コンテンツ」コントローラがなく、リクエストが確実にデフォルトのパターンに当たるからです。しかし代わりに私は自分のHTMLPageを見ている。 ここで何が間違っていますか?

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

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

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

答えて

5

RouteExistingFilesは、ルートがない場合、ファイルが表示されないようにします。ファイルが存在するかどうかを確認する前にルートをチェックするだけです。一致するルートがない場合、一致するファイルがあるかどうかを確認し続けます。

+0

"{controller}/{action}/{id}"パターンのデフォルトルートは〜/ Content/HTMLPage.htmlリクエストの良い候補のようです。だから、一致するルートがあります。 –

+0

@OleksandrKaplun: "Content"という名前のコントローラと、そのコントローラのアクションメソッドが "HTMLPage.html"という名前のコントローラを実際に持っている場合にのみ一致します。 – Guffa

+0

説得力がありますが、それでも動作しません。 RegisterRoutes関数の先頭に追加したのは次のとおりです: 'routes.MapRoute( " ExactMatch "、 " Content/HTMLPage.html "、 new {controller =" Home "、action =" About "}); '。それでも私はHTMLページの内容を表示します。 P.S.私はそれがこのように働くべきであることを理解しています(マニュアルはそうすべきだと言います)が、私はそれが私が間違ったことを推測しています。私はVS2012とWindows 7でローカルにテストしています。 –

5

Visual Studio 2012はIIS Expressを使用します。ディスクファイルがMVCルーティングシステムに渡される前に、その要求をインターセプトしないようにIISに指示する必要があります。あなたはこのパス上の設定ファイルを見つけることができますwin7の/ 8で

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

%userprofile%\Documents\IISExpress\config\applicationhost.config

+0

これは私のために働いた、ありがとう、私はそれがソリューションごとに構成することはできないと仮定しますか? – Savage

+0

このモジュールを追加する前にを追加することができます。参照:https://svenaelterman.wordpress.com/2011/01/31/using-asp-net-4-0-extension-less-routing-on-iis-7-5/ – XPD

16

次の手順を実行する必要があります静的ファイルのルーティングを有効にするには、設定ファイルの空の文字列に設定preCondition属性を必要としています。 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" /> 

'path'の値は、要件に応じてより一般的または具体的にすることができます。しかし、私はそれが常に自分の必要性に応じて非常に具体的であることを好む。非常に一般的なままにすると、.jsやcssファイルなどのサイト固有のリソースの配信がブロックされます。たとえば、上記のようにpath = "*"と設定されている場合、ページがどのように見えるかを担当するcss(コンテンツフォルダ内)のリクエストもコントローラの動作になります。あなたが好きではない何か。

関連する問題