摘要:VS 2010 和 .NET 4.0 系列之《自動啟動ASP.NET應用》篇
【原文位址】Auto-Start ASP.NET Applications (VS 2010 and .NET 4.0 Series)
【原文發表日期】 Tuesday, September 15, 2009 1:46 AM
這是我針對即將發佈的VS 2010 和 .NET 4所撰寫的 文章系列的第七篇。
我想換一下討論的主題,從討論新的VS 2010工具特性,轉而寫幾個文章討論幾個新的執行時特性(別擔心,我還會轉回來討論更多VS特性的,我只是想混合一下)。
今天的文章討論一個你可以選擇利用的ASP.NET 4中小小的,但很棒的新特性,即,自動啟動,先行初始化web應用,而不必等待外部客戶端訪問web伺服器時才啟動的能力。這可以有助於你給第一個訪問者提供一個更快的回復體驗,避免撰寫定制腳本來「預熱(warm up)」伺服器和準備好任何資料快取。它可用於任何型別的ASP.NET應用,包括基於ASP.NET Web Forms和ASP.NET MVC的應用。
在ASP.NET 4中自動啟動Web應用
有些web應用在可以處理用戶訪問之前,需要載入很多的資料,或做一些花費很大的初始化處理。今天使用 ASP.NET 的開發人員經常使用應用的Global.asax 文件中的 「Application_Start」事件處理函數來做這些工作(該事件是在第一個請求執行時觸發的)。他們要麼設計定制腳本,週期性地向應用發假的請求,來「喚醒它(wake it up)」,從而在客戶訪問之前執行這個程式碼,或者就讓那不幸的第一個訪問者等著這個邏輯執行完才處理其請求(這可以給這些用戶造成很長的耽擱)。
ASP.NET 4中有一個叫「自動啟動(auto-start)」的新特性,可以較好地解決這個場景, 可以在IIS 7.5(隨Windows 7和Windows Server 2008 R2發佈)上運行 ASP.NET 4時使用。這個自動啟動特性提供了一個可控制的方式來啟動一個應用工作行程,初始化ASP.NET 應用,然後接受HTTP請求。
將一個ASP.NET 4應用配置成自動啟動
要使用ASP.NET 4自動啟動特性,你首先配置IIS應用池工作行程,使在其中運行的應用在web伺服器最先載入時即自動啟動。配置方法是,打開IIS 7.5的applicationHost.config文件(C:\Windows\System32\inetsrv\config\applicationHost.config),在合適的<applicationPools>中加一個 startMode=」AlwaysRunning」屬性:
<applicationPools>
<add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>
如果你執行Windows 工作管理員,點擊「顯示所有用戶的行程」復選框,然後把applicationHost.config文件的startMode屬性改動保存的話,在文件保存後的瞬間就會看到一個新的「w3wp.exe」 工作行程啟動起來了。
一個單一IIS應用池工作行程可以宿主多個ASP.NET 應用,你可以透過在對應應用的 <application> 中加一個serviceAutoStartEnabled="true" 屬性,來指定在工作行程載入時你想要哪些應用自動啟動起來:
<sites>
<site name="MySite" id="1">
<application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" />
</site>
</sites>
<serviceAutoStartProviders>
<add name="PreWarmMyCache" type="PreWarmCache, MyAssembly" />
</serviceAutoStartProviders>
上面的serviceAutoProvider="PreWarmMyCache" 屬性引用了config文件中的一個提供者(provider)配置,允許你配置一個自訂的類別,該類別用於封裝應用的任何 "預熱(warming up)" 邏輯。這個類別會在工作行程和應用預載時(在收到任何外部web請求之前)自動被叫用,可用於執行想要在接受和處理請求之前執行的任何初始化或快取載入邏輯:
public class PreWarmCache : System.Web.Hosting.IProcessHostPreloadClient {
public void Preload(string[] parameters) {
// Perform initialization and cache loading logic here…
}
}
IIS會將應用啟動到這樣一個狀態,在這個狀態中,它不能接受請求,直到你的 "預熱(warming up)" 邏輯完成為止。在Preload方法中的初始化程式碼運行完傳回之後,ASP.NET 應用會被標記為可處理請求了。
你也可以把新的自動啟動"warming up"特性與IIS7 應用請求導向(Application Request Routing, ARR) 擴展的負載平衡功能結合起來,用它來在應用完成初始化,可以接受HTTP請求之後,向負載平衡器發信號,在這個時候,伺服器可以放入web farm來處理請求。
結語
ASP.NET 4 和 IIS 7.5的自動啟動新特性提供了一個定義明確的方式,允許你在任何終端用戶訪問你的應用之前,運行花費大的應用啟動和預先快取邏輯,這允許你一開始就將應用「預熱(warmed up)」好,提供一個始終如一的高性能體驗。
希望本文對你有所幫助,
Scott
附註: 除了寫部落格外,最近我一直在使用Twitter發短貼和共享連結。你可以在Twitter上透過 http://www.twitter.com/scottgu (@scottgu是我的twitter名)跟隨我。