本主題討論如何與 ASP.NET 並存裝載 Windows Communication Foundation (WCF) 服務,並以 ASP.NET 相容性模式裝載它們。
與 ASP.NET 並存裝載 WCF
裝載在 Internet Information Services(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: Current 總是
null
在 WCF 服務中存取時。 請改用 RequestContext。檔案型授權:在決定服務要求是否獲得授權時,WCF 安全性模型不允許套用至服務 .svc 檔案的訪問控制清單 (ACL)。
設定型 URL 授權:同樣地,WCF 安全性模型不會遵守 System.Web 授權 <組態元素中指定的任何 URL 型授權> 規則。 如果服務位於 ASP.NET URL 授權規則所保護的 URL 空間中,WCF 要求會忽略這些設定。
HttpModule 擴充性:WCF 主機架構會在引發PostAuthenticateRequest事件時攔截 WCF 要求,且不會將處理傳回至 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 相容性 範例。