通往代碼的路徑應該盡可能快速,是嗎?可能有時您會覺得針對每個請求執行的或者每 n 個請求執行一次的任務所需資源非常多。發送電子郵件或者分析和驗證傳入數據就是這樣的一些例子。
剖析 ASP.NET Forums 1.0 并重新構建組成社區服務器的內容時,我們發現添加新張貼的代碼路徑非常慢。每次添加新張貼時,應用程序首先需要確保沒有重復的張貼,然后必須使用“壞詞”篩選器分析該張貼,分析張貼的字符圖釋,對張貼添加標記并進行索引,請求時將張貼添加到合適的隊列,驗證附件,最終張貼之后,立即向所有訂閱者發出電子郵件通知。很清楚,這涉及很多操作。
經研究發現,大多數時間都花在了索引邏輯和發送電子郵件上。對張貼進行索引是一個非常耗時的操作,人們發現內置的 System.Web.Mail 功能要連接 SMYP 服務器,然后連續發送電子郵件。當某個特定張貼或主題領域的訂閱者數量增加時,執行 AddPost 功能所需的時間也越來越長。
并不需要針對每個請求都進行電子郵件索引。理想情況下,我們想要將此操作進行批處理,一次索引 25 個張貼或者每五分鐘發送一次所有電子郵件。我們決定使用以前用于對數據緩存失效進行原型設計的代碼,這個失效是用于最終進入 Visual Studio® 2005 的內容的。
System.Threading 命名空間中的 Timer 類非常有用,但是在 .NET Framework 中不是很有名,至少對于 Web 開發人員來說是這樣。創建之后,這個 Timer 類將以一個可配置的間隔針對 ThreadPool 中的某個線程調用指定的回調。這就表示,您可以對代碼進行設置,使其能夠在沒有對 ASP.NET 應用程序進行傳入請求的情況下得以執行,這是后臺處理的理想情況。您還可以在此后臺進程中執行如索引或發送電子郵件之類的操作。
但是,這一技術有幾個問題。如果應用程序域卸載,該計時器實例將停止觸發其事件。另外,因為 CLR 對于每個進程的線程數量具有一個硬性標準,所以可能會出現這樣的情形:服務器負載很重,其中計時器可能沒有可在其基礎上得以完成的線程,在某種程度上可能會造成延遲。ASP.NET 通過在進程中保留一定數量的可用線程,并且僅使用總線程的一部分用于請求處理,試圖將上述情況發生的機會降到最低。但是,如果您具有很多異步操作時,這可能就是一個問題了。
這里沒有足夠的空間來放置該代碼,但是您可以下載一個可以看懂的示例,網址是www.rob-howard.net。請了解一下 Blackbelt TechEd 2004 演示中的幻燈片和演示。
=========================
技巧 7 — 頁輸出緩存和代理服務器
ASP.NET 是您的表示層(或者說應該是您的表示層);它由頁、用戶控件、服務器控件(HttpHandlers 和 HttpModules)以及它們生成的內容組成。如果您具有一個 ASP.NET 頁,它會生成輸出(HTML、XML、圖像或任何其他數據),并且您針對每個請求運行此代碼時,它都會生成相同的輸出,那么您就擁有一個可用于頁輸出緩存的絕佳備選內容。
將此行內容添加頁的最上端
<%@ Page OutputCache VaryByParams="none" Duration="60" %>
就可以高效地為此頁生成一次輸出,然后對它進行多次重用,時間最長為 60 秒,此時該頁將重新執行,輸出也將再一次添加到 ASP.NET 緩存。通過使用一些低級程序化 API 也可以完成此行為。對于輸出緩存有幾個可配置的設置,如剛剛講到的 VaryByParams 屬性。VaryByParams 剛好被請求到,但還允許您指定 HTTP GET 或 HTTP POST 參數來更改緩存項。例如,只需設置 VaryByParam="Report" 即可對 default.aspx?Report=1 或 default.aspx?Report=2 進行輸出緩存。通過指定一個以分號分隔的列表,還可以指定其他參數。
很多人都不知道何時使用輸出緩存,ASP.NET 頁還會生成一些位于緩存服務器下游的 HTTP 標頭,如 Microsoft Internet Security and Acceleration Server 或 Akamai 使用的標頭。設置了 HTTP 緩存標頭之后,可以在這些網絡資源上對文檔進行緩存,客戶端請求也可在不必返回原始服務器的情況下得以滿足。
因此,使用頁輸出緩存不會使得您的應用程序效率更高,但是它可能會減少服務器上的負載,因為下游緩存技術會緩存文檔。當然,這可能只是匿名內容;一旦它成為下游之后,您就再也不會看到這些請求,并且再也無法執行身份驗證以阻止對它的訪問了。
========================
技巧 8 — 運行 IIS 6.0(只要用于內核緩存)
如果您未運行 IIS 6.0 (WindowsServer? 2003),那么您就錯過了 Microsoft Web 服務器中的一些很好的性能增強。在技巧 7 中,我討論了輸出緩存。在 IIS 5.0 中,請求是
文章來源于領測軟件測試網 http://www.k11sc111.com/