¿Hay alguna forma de capturar todas las solicitudes entrantes a mi aplicación ASP.NET MVC 4 y ejecutar algún código antes de continuar con la solicitud hacia el controlador / acción especificado?
Necesito ejecutar un código de autenticación personalizado con los servicios existentes, y para hacerlo correctamente, tendré que poder interceptar todas las solicitudes entrantes de todos los clientes para verificar algunas cosas con el otro servicio.
asp.net-mvc
asp.net-mvc-4
Jesse
fuente
fuente
Respuestas:
La forma más correcta sería crear una clase que herede ActionFilterAttribute y anule el
OnActionExecuting
método. Esto puede ser registrada en elGlobalFilters
enGlobal.asax.cs
Por supuesto, esto solo interceptará solicitudes que realmente tengan una ruta.
fuente
protected void Application_BeginRequest(object sender, EventArgs e)
.OnActionExecuting
anulación?Puede usar un HttpModule para lograr esto. Aquí hay una muestra que utilizo para calcular el tiempo de proceso para todas las solicitudes:
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 */ } } }
Y así es como registras el módulo en Web.Config:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" /> </modules> <//system.webServer>
fuente
runAllManagedModulesForAllRequests
un freno de rendimiento.Application_BeginRequest
parece una forma mucho más sencilla de lograr el resultadoCreo que lo que buscas es esto:
http://www.dotnetcurry.com/showarticle.aspx?ID=126
Lo pones
Global.asax.cs
.protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Request.....; }
Utilizo esto con fines de depuración, pero no estoy seguro de qué tan buena solución es para su caso.
fuente
No estoy seguro de MVC4, pero creo que es bastante similar a MVC5. Si ha creado un nuevo proyecto web -> busque
Global.asax
y verá la siguiente líneaFilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
en el métodoApplication_Start()
.RegisterGlobalFilters
es un método en el archivoFilterConfig.cs
ubicado en la carpetaApp_Start
.Como dijo @ YngveB-Nilsen,
ActionFilterAttribute
en mi opinión, es el camino a seguir. Agregue una nueva clase que se derive deSystem.Web.Mvc.ActionFilterAttribute
. Esto es importante porqueSystem.Web.Http.Filters.ActionFilterAttribute
fallará con la siguiente excepción, por ejemplo.Ejemplo que escribe la solicitud en la ventana de depuración:
public class DebugActionFilter : System.Web.Mvc.ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext actionContext) { Debug.WriteLine(actionContext.RequestContext.HttpContext.Request); } }
En
FilterConfig
->RegisterGlobalFilters
-> añadir la siguiente línea:filters.Add(new DebugActionFilter());
.Ahora puede capturar todas las solicitudes entrantes y modificarlas.
fuente