2009-07-06 92 views
0

1)在我的所有控制器上使用这些属性不是不好的做法吗?Asp.NET MVC:练习题

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

2)如果我需要调用从客户某些服务器功能,使用AJAX。 为这样的任务创建一个特殊的控制器(命名即“WebServiceController”)是好主意吗?

+0

使用压缩过滤器优于IIS配置的gzip有什么好处? – redsquare 2009-07-06 13:25:45

回答

1

问题1

我看不出什么毛病,使用上所有的控制器下,[HandleError]属性。您希望能够捕获正在处理的任何操作或结果抛出的未处理的异常。

[CompressFilter]属性有点棘手,但对于大多数HTML或基于文本的响应,您应该能够获得大量的压缩。如果您使用文件附件等二进制文件进行响应,则可能不想使用该属性。最后,等到你获得足够的流量来查看压缩的好处是否超过成本。

问题2

一般来说,你不希望有一个控制器只服务AJAX请求。使用最适合AJAX调用请求的资源的控制器。

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

+0

关于问题1 - 难道我不需要一次又一次地重复这些行吗? – 2009-07-06 11:03:57

1
  1. 我会在控制器上应用过滤器,而不是将它们应用于每个动作。
    如果他们确实需要全部动作(可能涉及到为例外创建另一个过滤器) - there are将它们应用于应用程序范围的技术(也可能是通过继承为控制器应用指定过滤器的一个好主意)。

    我想有很多方法可以解决这个问题 - 很难找到正确的,适合您的需求的。

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

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