今天發現一段特別的程式碼,我們有個方案(Solution)裡有個共用的類別庫(Class Library)專案,此類別庫專案同時提供給多個 Windows 應用程式、Windows 服務以及 ASP.NET 應用程式來使用,但同事用了有點複雜的程式撰寫方法取得目前的 .NET 程式是否為 ASP.NET 執行環境,因此特別撰寫一篇短文來提醒較為簡單易懂的方式。
成員使用了 System.Diagnostics 命名空間下的 Process 類別來取得目前正在執行的處理序(Process):
if (System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName.IndexOf("w3wp") >= 0)
{
// 這段判斷在 Web 環境下執行
}
這樣的寫法在開發環境可以執行,但部署到正式機的時候就很有可能會掛點,因為 Process 類別必須在 FullTrust 的環境下才能使用:
另一個潛在的問題是執行 ASP.NET 並不一定會跑在 w3wp.exe 程序下 ( IIS6, IIS7 ),也有可能會執行在 IIS 5.0 的 aspnet_wp.exe 程序下:
- .NET 1.1
- C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_wp.exe
- .NET 2.0
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_wp.exe
- .NET 4.0
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_wp.exe
或是執行在 Visual Studio 內建的開發人員伺服器下:
- C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.EXE
或是執行在 Visual Studio 2010 SP1 所提供的 IIS Express 7.5 程序裡!
- C:\Program Files (x86)\IIS Express\iisexpress.exe
因此判斷 w3wp.exe 並不完整。
其實判斷方法非常簡單,只要判斷 HttpRuntime.AppDomainAppId 屬性是否為 null 即可,如下:
if (System.Web.HttpRuntime.AppDomainAppId != null)
{
// ASP.NET 網站應用程式
}
else
{
// Windows 應用程式或 Windows 服務
}
類別庫在使用這段程式碼判斷時記得要載入 System.Web 組件參考才行喔!
請注意
若你將 WCF 服務裝載(Hosting)在 IIS 服務下執行,其 HttpContext.Current 屬性將會是 null,因此在類別庫中最好不要使用 HttpContext.Current 屬性來判斷目前是否為 Web 環境。
相關連結