2010-11-26 6 views
2

J'ai un attribut de filtre d'action sur ma classe BaseController:MVC.net attribut disable pour les méthodes particulières

<CompressFilter()> _ 
Public Class BaseController 

Ainsi, ce filtre est appliqué à toutes les méthodes dans tous les contrôleurs de mon application. Est-il possible de désactiver ce filtre pour certaines méthodes particulières?

Répondre

3

Si vous avez accès au code de CompressFilter, c'est. Vous pouvez ajouter un second attribut. Par exemple NoCompressAttribute. Dans la méthode OnActionExecuting du CompressFilter, vous regardez les ActionDescriptors et si le NoCompressAttribute est appliqué, vous ne faites pas la compression.

EDIT: Voici le code

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

Et puis sur l'action que vous ne voulez pas faire la compression:

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

espoir qui aide

+0

semble bon. Merci! – Egor4eg

+0

Mais .. Dans ce cas, ce code est exécuté 2 fois pour chaque requête. Chose laide. Je vais utiliser la première option (avec NoCompressAttribute). Je pense que c'est plus logique. – Egor4eg

+0

Je suis d'accord. C'est probablement une meilleure idée. C'était plus facile lorsque je démostrais l'idée car j'avais seulement besoin d'une classe. –

1

Non, ce n'est pas le cas. Lorsque vous appliquez un attribut d'action à un contrôleur, il s'applique à toutes les actions. Vous devrez peut-être déplacer l'action que vous souhaitez exclure vers un autre contrôleur.

+0

Puis-je hériter de contrôleur et BaseController désactiver cet attribut en elle? – Egor4eg

+0

Que voulez-vous dire par désactiver un attribut? Un attribut est cuit dans les métadonnées de l'assembly lors de la compilation. –

-1

Vous pouvez appliquer FilterAttribute aux méthodes explicitement, au lieu de l'appliquer à tous les contrôleurs. Supprime l'attribut de la classe BaseController et l'ajoute uniquement aux méthodes que vous devez compresser.

+0

Il y a des centaines de méthodes dans mon application. Et seulement certains d'entre eux vont avoir cet attribut désactivé – Egor4eg

+0

C'est seulement la solution que je sais, désolé –