The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

在類別庫裡如何判斷 .NET 程式執行在 Web 環境下

今天發現一段特別的程式碼,我們有個方案(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 環境。

相關連結