2012-06-29 23 views
17

私は数時間のグーグルとチンカリングを行っていて、実際には進歩はありませんでしたので、ここの誰かが助けてくれるでしょう。ASP.NET MVCルート:パスの静的ファイルハンドラーをバイパスします

私は、サードパーティのコンポーネントによって処理される特定のパスへのすべてのリクエストを取得しようとしています。

EDITそして、他のすべてのパスに対するすべての要求が正常に動作する必要があります。

私はこのようなワイルドカードマッピングとルートハンドラを使用しています:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

前方正しくサードパーティのコンポーネントにうまく転送ハンドラにすべての伝統的なルートは。静的ファイル(.html、.txtなど)を取得すると、ハンドラではなくStaticFileハンドラによって取得されるため、StaticFileハンドラを無効にしようとしています。

これはStaticFileハンドラをオフにしますが、MVCはまだルートを取得しません。

私は自分自身のハンドラを作成し、ASP要求スタックに注入するのをやめたいのですが、これを行うにはMVC-幸せな方法があるようです。

どのような考えですか?ありがとう。

答えて

14

ここにはいくつかのオプションがあります。

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

あなたが本当にasp.net管を介して実行されているすべてのリクエストをしたいなら、あなたは必要です。静的なハンドラをバイパスするためにあなたの必要性をあなたのサイトのサブセットに制限されている場合

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

更新

別のオプションは、特に、上でどのように考えると、次の

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

を使用することですほとんどの静的ファイルはよく知られているいくつかのディレクトリから処理されますが、これはもっと良いオプションです。

+0

おかげ。私が試したことは間違いありませんが、他のすべてのパスを正常に処理したいのです。実際には、これを行うためのMVCの方法がないように見え始めています。MVCの前にハンドラを追加して追加するだけです。 – jmoss

+0

あなたが望むものと処理したくないものの詳細については確かではありませんが、mvcで処理するために、asp.netパイプは適切なすべての要求を受け取る必要があります。 –

+0

重要: ''は、統合モードパイプラインを実行するアプリケーションプールにのみ適用されます。これは、クラシックモードで実行されているアプリケーションプールでは機能しません。 – BenSwayne

2

おそらくURL Rewriterを使用して、元のURLからの要求をMVCフレンドリーな代替方法にプロキシすることです。

たとえば、データベースから提供されたコンテンツの相対URLを自動的に読み込む必要があるとします。

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

これらのルールを使用すると、2つのMVCのルートを設定してみます:

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

をしてから、アクションメソッドは単純です。

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

最初の書き換えルールを含むパスを防ぐためにそこにあります/ relは書き直されない。彼らはすでに最終的な形になっています。 2番目の書き換えルールは、要求をリダイレクトせずにプロキシします。

/load/1234/file.xml 

がリクエストをプロキシ代わりにクライアントリダイレクトを行う

/load/1234/rel?path=file.xml 

ほどうまく機能するために、ネストされた相対パスを有効に(およびエンドユーザからの秘密のソースを非表示にします。)

関連する問題