2009-07-06 94 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),如果需要的話 - 檢查它是否是部分請求。

請記住,過濾器不能通用。對我來說 - 這是一個巨大的缺點。