¿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
OnActionExecutingmétodo. Esto puede ser registrada en elGlobalFiltersenGlobal.asax.csPor supuesto, esto solo interceptará solicitudes que realmente tengan una ruta.
fuente
protected void Application_BeginRequest(object sender, EventArgs e).OnActionExecutinganulació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
runAllManagedModulesForAllRequestsun freno de rendimiento.Application_BeginRequestparece 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.asaxy verá la siguiente líneaFilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);en el métodoApplication_Start().RegisterGlobalFilterses un método en el archivoFilterConfig.csubicado en la carpetaApp_Start.Como dijo @ YngveB-Nilsen,
ActionFilterAttributeen 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.ActionFilterAttributefallará 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