79

ASP.NET MVC 4 アプリへのすべての着信要求をキャッチし、指定されたコントローラー/アクションに要求を続行する前にコードを実行する方法はありますか?

既存のサービスでいくつかのカスタム認証コードを実行する必要があります。これを適切に行うには、すべてのクライアントからのすべての受信リクエストをインターセプトして、他のサービスでいくつかのことを再確認できる必要があります。

4

4 に答える 4

81

最も正しい方法は、ActionFilterAttributeとオーバーライドOnActionExecutingメソッドを継承するクラスを作成することです。これは、に登録することができGlobalFiltersますGlobal.asax.cs

もちろん、これは実際にルートを持つリクエストのみをインターセプトします。

于 2012-07-30T17:54:22.387 に答える
38

これを実現するには、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>
于 2012-07-30T17:57:54.217 に答える
25

あなたが探しているのはこれだと思います:

Application_BeginRequest()

http://www.dotnetcurry.com/showarticle.aspx?ID=126

あなたはそれを入れますGlobal.asax.cs

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Request.....;
    }

私はこれをデバッグ目的で使用していますが、あなたの場合の解決策がどれほど良いかわかりません.

于 2013-12-10T08:44:11.483 に答える