WCF 服務和 ASP.NET
本主題討論與 ASP.NET 並存裝載 Windows Communication Foundation (WCF) 服務,並以 ASP.NET 相容性模式裝載它們。
與 ASP.NET 並存裝載 WCF
裝載在網際網路資訊服務 (IIS) 中的 WCF 服務可以與 .ASPX 頁面和 ASMX Web 服務位於單一、共同的應用程式定義域中。 ASP.NET 提供常見的基礎結構服務,例如 WCF 和 ASP.NET HTTP 執行時間的 AppDomain 管理和動態編譯。 WCF 的預設組態與 ASP.NET 並存。
ASP.NET HTTP 執行時間會處理 ASP.NET 要求,但不會參與 WCF 服務的要求處理,即使這些服務裝載在與 ASP.NET 內容相同的 AppDomain 中也一樣。 反之,WCF 服務模型會攔截發給 WCF 服務的訊息,並將這些訊息透過 WCF 傳輸/通道堆疊路由出去。
並存模型的結果如下:
ASP.NET 和 WCF 服務可以共用 AppDomain 狀態。 由於這兩個架構可以共存于相同的 AppDomain 中,因此 WCF 也可以與 ASP.NET (共用 AppDomain 狀態,包括靜態變數、事件等等) 。
不論裝載環境和傳輸為何,WCF 服務的行為都是一致的。 ASP.NET HTTP 執行階段主要用來與 IIS/ASP.NET 裝載環境和 HTTP 通訊搭配使用。 另一方面,WCF 則是會在各種裝載環境 (WCF 會在 IIS 內部與外部採取一致的行為) 與各種傳輸 (透過 IIS 7.0 以及更新版本裝載的服務會在所公開的所有端點上採取一致的行為,即使這些端點當中有一些使用 HTTP 以外的通訊協定) 中採取一致的行為。
在 AppDomain 中,HTTP 執行時間實作的功能會套用至 ASP.NET 內容,但不適用於 WCF。 ASP.NET 應用程式平臺的許多 HTTP 特定功能不適用於 AppDomain 內裝載的 WCF 服務,其中包含 ASP.NET 內容。 下列為這些功能的範例:
HttpContext:當從 WCF 服務內存取時,Current 一律為
null
。 請改用 RequestContext。檔案架構授權:在決定是否要授權服務要求時,WCF 安全性模型不允許將存取控制清單 (ACL) 套用到服務的 .svc 檔。
組態架構的 URL 授權:同理,WCF 安全性模型不會遵守任何在 System.Web <授權> 組態項目中指定的 URL 架構授權規則。 如果服務位於 ASP.NET 的 URL 授權規則所保護的 URL 空間中,WCF 要求會忽略這些設定。
HttpModule 擴充性:WCF 裝載基礎結構會在引發事件時攔截 WCF 要求, PostAuthenticateRequest 而不會傳回處理至 ASP.NET HTTP 管線。 寫入程式碼中以便在管線的較後期階段攔截要求的模組,無法攔截 WCF 要求。
ASP.NET 模擬:根據預設,WCF 要求一律會以 IIS 進程身分識別執行,即使 ASP.NET 設定為使用 System.Web 的 < 身分識別 impersonate=「true」 / > 組態選項來啟用模擬。
這些限制只會套用至裝載在 IIS 應用程式中的 WCF 服務。 ASP.NET 內容的行為不會受到 WCF 的存在影響。
通常需要由 HTTP 管線提供功能的 WCF 應用程式,應該考慮使用不會受到主機與傳輸影響的 WCF 對等用法:
以 OperationContext 取代 HttpContext。
以 ServiceAuthorizationBehavior 取代 ASP.NET 的檔案/URL 授權。
IDispatchMessageInspector 或是自訂層級的通道,以取代 HTTP 模組。
使用 WCF 模擬每一個作業,以取代 System.Web 模擬。
或者,您可以考慮在 WCF 的 ASP.NET 相容性模式中執行服務。
以 ASP.NET 相容性模式裝載 WCF 服務
雖然 WCF 模型可以在各種裝載環境與傳輸中表現一致的行為,但是常會有一些情況是應用程式根本不需要這麼大的彈性。 WCF 的 ASP.NET 相容性模式適用于不需要裝載 IIS 外部的案例,或透過 HTTP 以外的通訊協定進行通訊,但使用 ASP.NET Web 應用程式平臺的所有功能。
不同于預設並存組態,其中 WCF 裝載基礎結構會攔截 WCF 訊息,並將其路由傳送到 HTTP 管線中,在 ASP.NET 相容性模式中執行的 WCF 服務會完全參與 ASP.NET HTTP 要求生命週期。 在相容性模式中,WCF 服務會透過 IHttpHandler 實作來使用 HTTP 管線,方式與 ASPX 頁面要求和 ASMX Web 服務要求的處理方式差不多。 因此,WCF 的行為與 ASMX 相同,與下列 ASP.NET 功能相同:
HttpContext:在相容性模式 ASP.NET 中執行的 WCF 服務可以存取 Current 及其相關聯的狀態。
檔案型授權:在 ASP.NET 相容性模式中執行的 WCF 服務可以透過將檔系統存取控制清單 (ACL) 附加至服務的 .svc 檔案來保護。
可設定的 URL 授權:當 WCF 服務以 ASP.NET 相容性模式執行時,會針對 WCF 要求強制執行 ASP.NET 的 URL 授權規則。
HttpModuleCollection 擴充性:由於在 ASP.NET 相容性模式中執行的 WCF 服務完全參與 ASP.NET HTTP 要求生命週期,所以在 HTTP 管線中設定的任何 HTTP 模組都可以在服務調用前後操作 WCF 要求。
ASP.NET 模擬:WCF 服務會使用目前 ASP.NET 模擬執行緒的身分識別來執行,如果已為應用程式啟用 ASP.NET 模擬,可能會與 IIS 進程身分識別不同。 如果 ASP.NET 模擬和 WCF 模擬都針對特定服務作業啟用,服務實作最終會使用從 WCF 取得的身分識別來執行。
WCF 的 ASP.NET 相容性模式會透過位於應用程式Web.config檔案) 的下列組態 (,在應用層級啟用:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
如果未指定,則此值將預設為 false
。 的值 false
表示在應用程式中執行的所有 WCF 服務都不會在相容性模式中 ASP.NET 執行。
由於 ASP.NET 相容性模式意指與 WCF 預設基本上不同的要求處理語意,因此個別服務實作能夠控制它們是否在啟用 ASP.NET 相容性模式的應用程式內執行。 服務可以透過 AspNetCompatibilityRequirementsAttribute 來指出是否支援 ASP.NET 相容性模式。 這個屬性的預設值為 Allowed。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
下表說明整個應用程式相容性模式設定如何與個別服務所陳述的支援層級互動:
整個應用程式的相容性模式設定 | [AspNetCompatibilityRequirementsMode] 設定 |
觀察結果 |
---|---|---|
aspNetCompatibilityEnabled = "true " |
Required | 服務成功啟動。 |
aspNetCompatibilityEnabled = "true " |
Allowed | 服務成功啟動。 |
aspNetCompatibilityEnabled = "true " |
NotAllowed | 當服務接收訊息時,發生啟動錯誤。 |
aspNetCompatibilityEnabled = "false " |
Required | 當服務接收訊息時,發生啟動錯誤。 |
aspNetCompatibilityEnabled = "false " |
Allowed | 服務成功啟動。 |
aspNetCompatibilityEnabled = "false " |
NotAllowed | 服務成功啟動。 |
注意
IIS 7.0 和 WAS 允許 WCF 服務透過 HTTP 以外的通訊協定進行通訊。 不過,不允許在已啟用 ASP.NET 相容性模式的應用程式中執行的 WCF 服務公開非 HTTP 端點。 此類組態會在服務接收其第一則訊息時,產生啟動例外狀況。
如需為 WCF 服務啟用 ASP.NET 相容性模式的詳細資訊,請參閱 AspNetCompatibilityRequirementsMode 和 ASP.NET 相容性 範例。