2011-08-04 126 views
5

ASP.NET MVC是否支持某種RequestFilters - 在控制器和動作實例化之前每個請求執行一次的過濾器?ASP.NET MVC請求過濾器

+1

行動過濾器執行的操作方法之前被執行,但正如我所說的,我需要實現控制器之前的一些邏輯(主要是它的依賴)的實例化 –

回答

5

您可以創建自己的路由處理程序,它可能在管道的早期實現您的目標。

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處理程序在你的路線註冊。

1

ASP.NET MVC中有action filters,它允許您在執行請求的不同階段運行一些自定義代碼。

  1. 動作被執行
  2. 後的結果呈現
  3. 之前將結果呈現

根據不同的代碼後你願意執行執行

  • 之前的動作並且您想要執行的功能類型可能還有其他插入框架的方法。

  • +0

    執行關於您試圖實施的*邏輯*這樣我們可以爲您提供更適合的解決方案。 – SiberianGuy

    +0

    @Idsa,你可能是一個更具體一點,他們之前不控制器實例 –

    +0

    我需要在控制器實例化之前確定當前請求的本地化語言,因爲我的本地化服務是根據當前語言註冊的:綁定 .To .When(r => CurrentLanguage.Language == Language.English)(ninject句法)。所以如果CurrentLanguage不會被設置,控制器將不會被實例化。我可以在Global.asax Application_OnRequest中執行這個邏輯,但我認爲在ASP.NET MVC方式中可能會更自然一些 – SiberianGuy

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

    那些你創造了它,你可以用它每個動作,每個控制器甚至全球項目的基礎;

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 
    
         filters.Add(new CompressFilter()); 
    
        }