2010-11-26 28 views
2

禁用屬性我有我的BaseController類的行爲過濾器屬性:MVC.net特定方法

<CompressFilter()> _ 
Public Class BaseController 

因此,該過濾器被應用到我的應用程序的所有控制器的所有方法。 是否可以禁用某些特定方法的此過濾器?

回答

3

如果您有權訪問CompressFilter的代碼,您可以添加第二個屬性。例如NoCompressAttribute。在CompressFilter的OnActionExecuting方法中,您可以查看ActionDescriptors,如果應用NoCompressAttribute,則不會執行壓縮。

編輯:這裏是代碼

public class CompressFilter : ActionFilterAttribute 
    { 
     public bool Compress { get; set; } 
     public CompressFilter() 
     { 
      Compress = true; 
     } 

     public CompressFilter(bool compress) 
     { 
      Compress = compress; 
     } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var compressAttribs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(CompressFilter), true); 
      foreach (var item in compressAttribs) 
      { 
       if (!((CompressFilter)item).Compress) 
       { 
        return; 
       } 
      } 

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

,然後在你不想壓縮的動作做:

[CompressFilter(false)] 
public virtual ActionResult Index() 
{ 
} 

希望幫助

1

不,它不是。當您將操作屬性應用於控制器時,它適用於所有操作。您可能需要將要排除的操作移至其他控制器。

+0

我可以從BaseController繼承控制器禁用這個屬性呢? – Egor4eg 2010-11-26 09:42:52

+0

什麼意思是禁用屬性?編譯時會在程序集的元數據中烘焙屬性。 – 2010-11-26 09:43:45

-1

您可以明確地將FilterAttribute應用於方法,而不是應用於所有控制器。 從BaseController類中刪除屬性,並將其僅添加到需要壓縮的方法中。

+0

我的應用程序中有數百種方法。並且只有其中的一些將會禁用此屬性 – Egor4eg 2010-11-26 09:39:05