ASP.NET MVC request filters

ASP.NET MVC does not support any RequestFilters - filters that are executed once for each request before the creation of controllers and actions?

+5
source share
3 answers

You can create your own routing handler, which may be early enough in the pipeline to achieve your goal.

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

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

}

and the corresponding mvc handler:

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>");
        }
    }
}

You can then register the mvc handler in your route registers.

+5
source

ASP.NET MVC has action filters that allow you to run some kind of custom code at different stages of the query.

  • Before performing an action
  • After completing an action
  • ,

, , , , .

+1

;

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);
        }

    }

}

that you created, you can use it for every action, for each controller or even for a global project;

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) {

        filters.Add(new CompressFilter());

    }
+1
source

All Articles