代码之家  ›  专栏  ›  技术社区  ›  Feryt

Asp.NETMVC:实践问题

  •  0
  • Feryt  · 技术社区  · 17 年前

    1) 在我的所有控制器上使用这些属性不是一种坏习惯吗?

    [HandleError]
    [CompressFilter(Order = 1)]
    

    public class CompressFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if ( !AppConfig.IsResponseCompressionEnabled ) {
                base.OnActionExecuting(filterContext);
                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);
            }
        }
    }
    

    为这样的任务创建一个特殊的控制器(名为“WebServiceController”)是一个好主意吗?

    2 回复  |  直到 17 年前
        1
  •  1
  •   Praveen Angyan    17 年前

    问题1

    [CompressFilter]属性有点复杂,但是对于大多数HTML或基于文本的响应,您应该能够获得大量压缩。如果使用二进制文件(如文件附件)进行响应,则可能不希望使用该属性。最后,等待获得足够的流量,看看压缩的好处是否大于成本。

    问题2

    如果您的控制器在其构造函数中有任何昂贵的设置,那么您完全可以考虑设置一个单独的控制器来处理AJAX调用。

        2
  •  1
  •   Arnis Lapsa    17 年前
    1. 我会在控制器上应用过滤器,而不是在每个动作上应用过滤器。
      如果他们真的需要 全部的 操作(可能涉及为异常创建另一个筛选器)- there are 在应用程序范围内应用它们的技术(也可以通过继承为控制器应用指定的过滤器)。

    2. 我更喜欢在控制器中编写动作
      (即产品控制器中的GetProductByIdAsJson),如果需要,检查它是否是部分请求。

    请记住,过滤器不能是通用的。对我来说,这是一个巨大的缺点。