asp.net-mvc - net - install mvc 4 visual studio 2017
ASP.NET MVC 4 intercepta todas las solicitudes entrantes (4)
Creo que lo que buscas es esto:
Application_BeginRequest()
http://www.dotnetcurry.com/showarticle.aspx?ID=126
Lo pones en Global.asax.cs
.
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Request.....;
}
Lo uso para depuración, pero no estoy seguro de qué tan buena solución es para su caso.
¿Hay alguna forma de atrapar todas las solicitudes entrantes en mi aplicación ASP.NET MVC 4 y ejecutar algún código antes de continuar la solicitud hacia el controlador / acción especificada?
Necesito ejecutar algún código de autenticación personalizado con los servicios existentes, y para hacerlo correctamente, necesitaré poder interceptar todas las solicitudes entrantes de todos los clientes para verificar algunas cosas con el otro servicio.
No estoy seguro acerca de MVC4, pero creo que es bastante similar a MVC5. Si ha creado un nuevo proyecto web -> busque en Global.asax
y verá la siguiente línea FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
en el método Application_Start()
.
RegisterGlobalFilters
es un método en el archivo FilterConfig.cs
ubicado en la carpeta App_Start
.
Como @YngveB-Nilsen dijo que ActionFilterAttribute
es el camino a seguir en mi opinión. Agregue una nueva clase que se deriva de System.Web.Mvc.ActionFilterAttribute
. Esto es importante porque System.Web.Http.Filters.ActionFilterAttribute
fallará con la siguiente excepción, por ejemplo.
La instancia de filtro dada debe implementar una o más de las siguientes interfaces de filtro: System.Web.Mvc.IAuthorizationFilter, System.Web.Mvc.IActionFilter, System.Web.Mvc.IResultFilter, System.Web.Mvc.IExceptionFilter, System.Web .Mvc.Filters.IAuthenticationFilter.
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
-> agregue la siguiente línea: filters.Add(new DebugActionFilter());
.
Ahora puede capturar todas las solicitudes entrantes y modificarlas.
Puede usar un HttpModule para lograr esto. Aquí hay una muestra que uso 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 se registra el módulo en Web.Config:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" />
</modules>
<//system.webServer>
La forma más correcta sería crear una clase que herede ActionFilterAttribute y anule el método OnActionExecuting
. Esto puede registrarse en GlobalFilters
en Global.asax.cs
Por supuesto, esto solo interceptará las solicitudes que realmente tengan una ruta.