2016-05-18 5 views
1

私はHttpModuleを書いています。私はリクエストがMVCアプリケーションにあることを検出する方法を発見しようとしています。HttpModuleでMVCアプリケーションを検出する方法

私はこのようなハンドラのいくつかに夢中になっています。

public void Init(HttpApplication httpApp) 
{ 
    httpApp.PreRequestHandlerExecute += PreRequestHandlerExecute; 
    httpApp.PreSendRequestHeaders += PreSendRequestHeaders; 
    httpApp.PostRequestHandlerExecute += PostRequestHandlerExecute; 
} 

My PreRequestHandlerExecuteには、この条件が必要です。

public void PreRequestHandlerExecute(object sender, EventArgs e) 
{ 
    if isMvc(HttpContext.Current)) 
    { 
     doSomethingSpecificToMvc() 
    } 

isMvcは、()(ラメである)MVC要求を検出するために、ファイルの拡張子がないことのみに依存、これを好きに見えます。

private static bool isMvc(HttpContext ctx) 
{ 
    bool retVal = false; 
    if (string.IsNullOrEmpty(VirtualPathUtility.GetExtension(ctx.Request.ServerVariables["PATH_INFO"]))) 
    { 
     retVal = true; 
    } 

    return retVal; 
} 

リクエストがMVCアプリケーションにあるかどうかを判断するにはどうすればよいでしょうか?

+1

doSomethingSpecificToMvc()の実装は何ですか?私はなぜあなたがこの珍しい区別をしたいのか不思議です... –

答えて

0

最も良い方法は、HTTPヘッダーを見て、これに類似したエントリがあるかどうかを確認することです。ここで

X-AspNetMvc-バージョン3.0

は、あなたがやっていることのために働くかもしれisMvcの更新版です。

private static bool isMvc(HttpContext ctx) 
{ 
    bool retVal = false; 
    string []header = ctx.Request.Headers.AllKeys; 
    if (header.Contains("X-AspNetMvc")) 
    { 
     retVal = true; 
    } 

return retVal; 

}

+0

残念なことに、残念ながら、私たちはセキュリティのためにヘッダを抑制します。 –

0

エンドポイントがエンドポイントを呼び出し、応答でX-AspNetMvc-バージョンをチェックすることによってasp.net MVCアプリがある場合は、決定することができます。このヘッダーが応答にあるという要件はなく、デフォルトでフレームワークによってそこに配置されます。そのようなハックを見つけなければならないでしょう。なぜなら各フレームワークには独自のルーティングシステムと独自の特質があるからです。

0

これを発見しました。コンテキストハンドラが実装されている場合、これは機能します。

private static bool isMvc(HttpContext ctx) 
{ 
    bool retVal = false; 
    if (ctx.Handler != null && ctx.Handler.ToString() == "System.Web.Mvc.MvcHandler") 
    { 
     retVal = true; 
    } 

return retVal; 
} 
関連する問題