Gibt es eine Möglichkeit für mich, alle eingehenden Anforderungen an meine ASP.NET MVC 4-App abzufangen und Code auszuführen, bevor die Anforderung an den angegebenen Controller / die angegebene Aktion weitergeleitet wird?
Ich muss einen benutzerdefinierten Authentifizierungscode mit vorhandenen Diensten ausführen. Um dies ordnungsgemäß ausführen zu können, muss ich in der Lage sein, alle eingehenden Anforderungen aller Clients abzufangen, um einige Dinge mit dem anderen Dienst zu überprüfen.
asp.net-mvc
asp.net-mvc-4
Jesse
quelle
quelle
Antworten:
Am korrektesten wäre es, eine Klasse zu erstellen, die die ActionFilterAttribute- und Override-
OnActionExecuting
Methode erbt . Dies kann dann in der registriert wirdGlobalFilters
inGlobal.asax.cs
Dies fängt natürlich nur Anforderungen ab, die tatsächlich eine Route haben.
quelle
protected void Application_BeginRequest(object sender, EventArgs e)
.OnActionExecuting
Überschreibung zu erzwingen ?Sie können ein HttpModule verwenden, um dies zu erreichen. Hier ist ein Beispiel, mit dem ich die Prozesszeit für alle Anfragen berechne:
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 */ } } }
Und so registrieren Sie das Modul in Web.Config:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" /> </modules> <//system.webServer>
quelle
runAllManagedModulesForAllRequests
einen Leistungsverlust verwendet.Application_BeginRequest
scheint ein viel einfacherer Weg zu sein, um das Ergebnis zu erzielenIch denke, was Sie suchen, ist Folgendes:
http://www.dotnetcurry.com/showarticle.aspx?ID=126
Du hast es reingelegt
Global.asax.cs
.protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Request.....; }
Ich verwende dies zum Debuggen, bin mir aber nicht sicher, wie gut es für Ihren Fall ist.
quelle
Ich bin mir bei MVC4 nicht sicher, aber ich denke, es ist MVC5 ziemlich ähnlich. Wenn Sie ein neues Webprojekt erstellt haben -> schauen
Global.asax
Sie hinein und Sie sollten die folgende ZeileFilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
in der Methode sehenApplication_Start()
.RegisterGlobalFilters
ist eine Methode in der DateiFilterConfig.cs
im OrdnerApp_Start
.Wie @ YngveB-Nilsen sagte,
ActionFilterAttribute
ist meiner Meinung nach der richtige Weg. Fügen Sie eine neue Klasse hinzu, die von abgeleitet istSystem.Web.Mvc.ActionFilterAttribute
. Dies ist wichtig, da diesSystem.Web.Http.Filters.ActionFilterAttribute
beispielsweise mit der folgenden Ausnahme fehlschlägt.Beispiel, das die Anforderung in das Debug-Fenster schreibt:
public class DebugActionFilter : System.Web.Mvc.ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext actionContext) { Debug.WriteLine(actionContext.RequestContext.HttpContext.Request); } }
Fügen Sie in
FilterConfig
->RegisterGlobalFilters
-> die folgende Zeile hinzu :filters.Add(new DebugActionFilter());
.Sie können jetzt alle eingehenden Anforderungen abfangen und ändern.
quelle