2011-08-04 9 views
5

¿ASP.NET MVC es compatible con algún tipo de RequestFilters, los filtros que se ejecutan una vez por solicitud antes de la instanciación de controladores y acciones?Filtros de solicitud de ASP.NET MVC

+1

Los filtros de acción se ejecutan antes de ejecutar el método de acción pero no se ejecutan antes de la instanciación del controlador –

Respuesta

5

Puede crear su propio enrutador de enrutamiento, que podría estar lo suficientemente temprano en la tubería para lograr su objetivo.

public class MyRoutingHandler : IRouteHandler 
{ 
    protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new InterceptingMvcHandler(requestContext); 
    } 

    IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext) 
    { 
     return GetHttpHandler(requestContext); 
    } 

} 

y el correspondiente controlador MVC:

public class InterceptingMvcHandler : MvcHandler 
{ 
    public InterceptingMvcHandler(RequestContext requestContext) : base(requestContext) 
    { 
    } 

    protected override IAsyncResult BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, object state) 
    { 
     httpContext.Response.Write("<h2>BeginProcessRequest</h2>"); 
     return base.BeginProcessRequest(httpContext, callback, state); 
    } 

    protected override void EndProcessRequest(IAsyncResult asyncResult) 
    { 
     var context = RequestContext.HttpContext; 
     base.EndProcessRequest(asyncResult); 
     if (context != null) 
     { 
      context.Response.Write("<h2>EndProcessRequest</h2>"); 
     } 
    } 
} 

A continuación, puede registrar el manejador de MVC en sus registros de ruta.

1

Hay action filters en ASP.NET MVC que le permiten ejecutar algunos códigos personalizados en diferentes etapas de la ejecución de la solicitud.

  1. Antes de ejecutar una acción
  2. Después de ejecutar una acción
  3. Antes de que el resultado se representa
  4. Después de que el resultado se representa

Dependiendo del código que está dispuesto a ejecutar y el tipo de funciones que desea realizar allí podrían ser otras formas de conectarse al marco.

+0

Como dije, necesito implementar alguna lógica antes de la instanciación del controlador (principalmente sus dependencias) – SiberianGuy

+0

@Idsa, ¿podría ser un poco más específico? sobre la * lógica * que intentas implementar De esta forma, podremos ofrecerle una solución más adecuada. –

+0

Necesito determinar el idioma de localización para la solicitud actual antes de la creación de instancias del controlador porque mis servicios de localización están registrados según el idioma actual: Vincular .To .When (r => CurrentLanguage.Language == Language.English) (ninject sintaxis). Entonces, si CurrentLanguage no se configurara, el controlador no se creará una instancia. Podría simplemente ejecutar esta lógica en Global.asax Application_OnRequest, pero pensé que podría haber una forma más natural para ASP.NET MVC – SiberianGuy

1

aquí hay un ejemplo para usted;

public class CompressFilter : ActionFilterAttribute { 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { 

     HttpRequestBase request = filterContext.HttpContext.Request; 

     string acceptEncoding = request.Headers["Accept-Encoding"]; 

     if (string.IsNullOrEmpty(acceptEncoding)) return; 

     acceptEncoding = acceptEncoding.ToUpperInvariant(); 

     HttpResponseBase response = filterContext.HttpContext.Response; 

     if (acceptEncoding.Contains("GZIP")) { 

      response.AppendHeader("Content-encoding", "gzip"); 
      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 

     } else if (acceptEncoding.Contains("DEFLATE")) { 

      response.AppendHeader("Content-encoding", "deflate"); 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
     } 

    } 

} 

Si lo ha creado, puede usarlo por acción, por controlador o incluso para proyectos globales;

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

     filters.Add(new CompressFilter()); 

    } 
Cuestiones relacionadas