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

今天發現一段特別的程式碼，我們有個方案(Solution)裡有個共用的類別庫(Class Library)專案，此類別庫專案同時提供給多個 Windows 應用程式、Windows 服務以及 ASP.NET 應用程式來使用，但同事用了有點複雜的程式撰寫方法取得目前的 .NET 程式是否為 ASP.NET 執行環境，因此特別撰寫一篇短文來提醒較為簡單易懂的方式。

成員使用了 [System.Diagnostics](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.aspx) 命名空間下的 [Process](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.process.aspx) 類別來取得目前正在執行的**處理序**(Process)：

```
if (System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName.IndexOf("w3wp") >= 0)
{
    // 這段判斷在 Web 環境下執行
}
```

這樣的寫法在開發環境可以執行，但部署到正式機的時候就很有可能會掛點，因為 [Process](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.process.aspx) 類別必須在 FullTrust 的環境下才能使用：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/79407ed7bacd20229d45-image_688.png)

另一個潛在的問題是執行 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](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview) 程序裡！

-   C:\\Program Files (x86)\\IIS Express\\iisexpress.exe

因此判斷 w3wp.exe 並不完整。

其實判斷方法非常簡單，只要判斷 [HttpRuntime.AppDomainAppId](http://msdn.microsoft.com/zh-tw/library/system.web.httpruntime.appdomainappid.aspx) 屬性是否為 null 即可，如下：

```
if (System.Web.HttpRuntime.AppDomainAppId != null)
{
    // ASP.NET 網站應用程式
}
else
{
    // Windows 應用程式或 Windows 服務
}
```

類別庫在使用這段程式碼判斷時記得要載入 System.Web 組件參考才行喔！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c708fb75605880f81232-image_689.png)

**請注意**

若你將 WCF 服務裝載(Hosting)在 IIS 服務下執行，其 [HttpContext.Current](http://msdn.microsoft.com/zh-tw/library/system.web.httpcontext.current.aspx) 屬性將會是 null，因此在類別庫中最好不要使用 [HttpContext.Current](http://msdn.microsoft.com/zh-tw/library/system.web.httpcontext.current.aspx) 屬性來判斷目前是否為 Web 環境。

**相關連結**

-   [ASP.NET 信任層級和原則檔](http://msdn.microsoft.com/zh-tw/library/wyts434y.aspx)
-   [ASP.NET Web 應用程式安全性](http://msdn.microsoft.com/zh-tw/library/330a99hc.aspx)
-   [下載詳細資料： IIS 7.5 Express](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview)
-   [IIS Express Overview : IIS Express : Microsoft Web Platform : The Official Microsoft IIS Site](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview)
-   [HttpRuntime.AppDomainAppId 屬性](http://msdn.microsoft.com/zh-tw/library/system.web.httpruntime.appdomainappid.aspx) 
-   [HttpContext.Current 屬性](http://msdn.microsoft.com/zh-tw/library/system.web.httpcontext.current.aspx)
-   [System.Web 命名空間](http://msdn.microsoft.com/zh-tw/library/system.web.aspx)
-   [HttpContext 類別](http://msdn.microsoft.com/zh-tw/library/system.web.httpcontext.aspx)
-   [Hosting and Consuming WCF Services](http://msdn.microsoft.com/en-us/library/bb332338.aspx)   /   [裝載和使用 WCF 服務](http://msdn.microsoft.com/zh-tw/library/bb332338.aspx)
