【发布时间】:2011-08-05 02:50:19
【问题描述】:
ASP.NET MVC 是否不支持某种 RequestFilters - 在控制器和动作实例化之前每个请求执行一次的过滤器?
【问题讨论】:
-
动作过滤器在执行动作方法之前执行,但在控制器实例化之前不执行
标签: asp.net-mvc
ASP.NET MVC 是否不支持某种 RequestFilters - 在控制器和动作实例化之前每个请求执行一次的过滤器?
【问题讨论】:
标签: asp.net-mvc
您可以创建自己的路由处理程序,它可能在管道中足够早地实现您的目标。
public class MyRoutingHandler : IRouteHandler
{
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new InterceptingMvcHandler(requestContext);
}
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
{
return GetHttpHandler(requestContext);
}
}
以及对应的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>");
}
}
}
然后您可以在路由注册中注册 mvc 处理程序。
【讨论】:
这里有一个例子;
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);
}
}
}
您创建的,您可以在每个操作、每个控制器甚至全局项目基础上使用它;
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new CompressFilter());
}
【讨论】:
在 ASP.NET MVC 中有action filters 允许您在请求执行的不同阶段运行一些自定义代码。
根据您愿意执行的代码和您想要执行的功能类型,可能有其他方法可以插入到框架中。
【讨论】: