ASP.NET MVC 4 アプリへのすべての着信要求をキャッチし、指定されたコントローラー/アクションに要求を続行する前にコードを実行する方法はありますか?
既存のサービスでいくつかのカスタム認証コードを実行する必要があります。これを適切に行うには、すべてのクライアントからのすべての受信リクエストをインターセプトして、他のサービスでいくつかのことを再確認できる必要があります。
ASP.NET MVC 4 アプリへのすべての着信要求をキャッチし、指定されたコントローラー/アクションに要求を続行する前にコードを実行する方法はありますか?
既存のサービスでいくつかのカスタム認証コードを実行する必要があります。これを適切に行うには、すべてのクライアントからのすべての受信リクエストをインターセプトして、他のサービスでいくつかのことを再確認できる必要があります。
最も正しい方法は、ActionFilterAttributeとオーバーライドOnActionExecuting
メソッドを継承するクラスを作成することです。これは、に登録することができGlobalFilters
ますGlobal.asax.cs
もちろん、これは実際にルートを持つリクエストのみをインターセプトします。
これを実現するには、HttpModule を使用できます。すべてのリクエストの処理時間を計算するために使用するサンプルを次に示します。
using System;
using System.Diagnostics;
using System.Web;
namespace Sample.HttpModules
{
public class PerformanceMonitorModule : IHttpModule
{
public void Init(HttpApplication httpApp)
{
httpApp.BeginRequest += OnBeginRequest;
httpApp.EndRequest += OnEndRequest;
httpApp.PreSendRequestHeaders += OnHeaderSent;
}
public void OnHeaderSent(object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
httpApp.Context.Items["HeadersSent"] = true;
}
// Record the time of the begin request event.
public void OnBeginRequest(Object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
if (httpApp.Request.Path.StartsWith("/media/")) return;
var timer = new Stopwatch();
httpApp.Context.Items["Timer"] = timer;
httpApp.Context.Items["HeadersSent"] = false;
timer.Start();
}
public void OnEndRequest(Object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
if (httpApp.Request.Path.StartsWith("/media/")) return;
var timer = (Stopwatch)httpApp.Context.Items["Timer"];
if (timer != null)
{
timer.Stop();
if (!(bool)httpApp.Context.Items["HeadersSent"])
{
httpApp.Context.Response.AppendHeader("ProcessTime",
((double)timer.ElapsedTicks / Stopwatch.Frequency) * 1000 +
" ms.");
}
}
httpApp.Context.Items.Remove("Timer");
httpApp.Context.Items.Remove("HeadersSent");
}
public void Dispose() { /* Not needed */ }
}
}
モジュールを Web.Config に登録する方法は次のとおりです。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" />
</modules>
<//system.webServer>
あなたが探しているのはこれだと思います:
Application_BeginRequest()
http://www.dotnetcurry.com/showarticle.aspx?ID=126
あなたはそれを入れますGlobal.asax.cs
。
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Request.....;
}
私はこれをデバッグ目的で使用していますが、あなたの場合の解決策がどれほど良いかわかりません.