我經常在讚歎ASP.NET,它整體的架構實在是幽雅 。它的基於組件,可擴充的設計,可以讓我們專註於某一方面的工作。這樣,業務編寫人員可以專註於業務代碼的編寫而不用關心系統的許可權設計,系統最佳化人員專註於系統最佳化而不用關心商務邏輯;對於一些經常用到的組件,我們可以抽象成使用者控制項或自訂控制項。但是,話又說回來,如果一個人對ASP.NET的理解僅僅局域在Page_Load, Button_Click的代碼編寫,他永遠也無法理解如何進行基於組件的,可擴充的編寫代碼。這樣的人在團隊裡,只會一味的反對優秀架構師設計出來的解決方案,因為他們除了Page_Load, Button_Click,對ASP.NET一無所知。
現在主流的Web瀏覽器都支援gzip壓縮,所以,在Web伺服器程式的開發過程中,如果一個頁面產生的Html檔案很大,在傳輸之前對其進行gzip壓縮,可以大大的減小輸出的體積,加快傳輸的效率,對使用者的體驗也大大增加。所以,有必要對Web頁面的輸出進行壓縮。
為ASP.NET程式添加gzip壓縮功能,其實非常簡單,不用修改任何一行頁面邏輯代碼。只要添加一個HttpModule來處理相關的輸出就可以了。當然重新寫一個iis api擴充也是可取的。開源的部落格系統BlogEngine.NET中有一個專門支援頁面壓縮的模組,裡面的設計很簡單,也很實用。主要的思路是:修改HttpResponse的Filter,對http輸出資料流進行壓縮處理。下面是該模組的主要代碼:
/// /// 在模組初始化的時候,給PreRequestHandlerExecute事件添加回調。/// void IHttpModule.Init(HttpApplication context){if (BlogSettings.Instance.EnableHttpCompression){context.PreRequestHandlerExecute += new EventHandler(context_PostReleaseRequestState);}}
下面是回呼函數的實現,主要看CompressResponse(context); 這一行代碼就可以了。
/// /// 回調。/// void context_PostReleaseRequestState(object sender, EventArgs e){ HttpContext context = ((HttpApplication)sender).Context; if (context.CurrentHandler is System.Web.UI.Page
&& context.Request["HTTP_X_MICROSOFTAJAX"] == null && context.Request.HttpMethod == "GET"){ //設定對輸出資料流進行壓縮。CompressResponse(context);if (BlogSettings.Instance.CompressWebResource)context.Response.Filter = new WebResourceFilter(context.Response.Filter);}else if (!BlogSettings.Instance.CompressWebResource && context.Request.Path.Contains("WebResource.axd")){context.Response.Cache.SetExpires(DateTime.Now.AddDays(30));}}
下面是CompressResponse的實現:
/// /// 對輸出進行壓縮。/// public static void CompressResponse(HttpContext context){if (IsEncodingAccepted(DEFLATE)){context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);SetEncoding(DEFLATE);}else if (IsEncodingAccepted(GZIP)){context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);SetEncoding(GZIP);}}
代碼非常的簡單,並且對原有系統的代碼一行也沒有修改,做到了真正的可擴充。而且這也符合AOP的思想。
在實際的開發過程中,有很多人喜歡把所有的代碼寫到aspx.cs頁面裡,如許可權驗證。其實我很反對這樣做,因為這樣會使整個系統像一碗雜醬面一樣,任何東西都僅僅的藕合在一起,很難維護。