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

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 環境。

相關連結