我的BaseController类上有一个动作过滤器属性:
<CompressFilter()> _
Public Class BaseController
因此,此过滤器适用于我的应用程序的所有控制器中的所有方法。 是否可以针对某些特定方法禁用此过滤器?
答案 0 :(得分: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 :(得分:1)
不,不是。将操作属性应用于控制器时,它适用于所有操作。您可能需要将要排除的操作移动到其他控制器。
答案 2 :(得分:-1)
您可以显式地将FilterAttribute应用于方法,而不是应用于所有控制器。 从类BaseController中删除属性,并将其仅添加到需要压缩的方法中。