Share via


部分信任功能相容性

當 Windows Communication Foundation (WCF) 在部分信任的環境中執行時,僅支援有限的功能子集。 部分信任環境所支援的功能,主要是用在如 Supported Deployment Scenarios 主題所述的特定案例中。

基本權限需求

對於在下列標準具名權限集合中執行的應用程式,WCF 支援其中的功能子集:

  • 中度信任權限

  • 網際網路區域權限

嘗試在部分信任且包含更多限制性權限的應用程式中使用 WCF 可能會在執行階段導致安全性例外狀況。

合約

在部分信任環境中執行時,合約有下列限制:

  • 實作 [ServiceContract] 介面的服務類別必須是 public 且具有 public 建構函式。 如果此服務類別定義 [OperationContract] 方法,這些方法就必須是 public。 如果它改為實作 [ServiceContract] 介面,這些方法實作可以是明確或 private,前提是 [ServiceContract] 介面為 public

  • 使用 [ServiceKnownType] 屬性時,指定的方法必須是 public

  • [MessageContract] 類別和其成員都可以是 public。 如果 [MessageContract] 類別在應用程式組件中定義,它可以是 internal 且具有 internal 成員。

系統提供的繫結

部分信任環境可充分支援 BasicHttpBindingWebHttpBindingWSHttpBinding 僅支援傳輸安全性模式。

在部分信任環境中執行時,不支援使用 HTTP 以外 (例如, NetTcpBindingNetNamedPipeBinding,或 NetMsmqBinding) 之傳輸的繫結。

自訂繫結

自訂繫結可在部分信任環境中建立並加以使用,但是必須遵守本節所指定的限制。

傳輸

唯一允許使用的傳輸繫結項目為 HttpTransportBindingElementHttpsTransportBindingElement

編碼器

允許使用下列編碼器:

不支援訊息傳輸最佳化機制 (MTOM) 編碼器。

安全性

部分信任的應用程式可以透過 WCF 的傳輸層級安全性功能來保護自身通訊安全。 不支援訊息層級安全性。 設定繫結來使用訊息層級安全性會導致執行階段出現例外狀況。

不支援的繫結

不支援使用可信賴傳訊、交易,或訊息層級安全性的繫結。

序列化

部分信任環境同時支援 DataContractSerializerXmlSerializer 。 然而, DataContractSerializer 的使用需視下列情況而定:

  • 所有可序列化的 [DataContract] 型別必須是 public

  • [DataMember] 型別中所有可序列化的 [DataContract] 欄位或屬性必須具有公用和讀/寫性質。 在部分信任應用程式中執行 WCF 時,不支援 readonly 欄位的序列化與還原序列化。

  • 部分信任的環境不支援 [Serializable]/ISerializable 程式撰寫模型 (Programming Model)。

  • 已知型別必須在程式碼或電腦層級組態 (machine.config) 中指定。 為了安全起見,已知型別無法在應用程式層級的組態中指定。

  • 在部分信任環境中,實作 IObjectReference 的型別會擲回例外狀況。

如需在部分信任應用程式中安全使用 Partial Trust Best Practices 的詳細資訊,請參閱 DataContractSerializer 中的<序列化>一節。

集合型別

有些集合型別會同時實作 IEnumerable<T>IEnumerable。 例如,可實作 ICollection<T>的型別。 此類型別可實作 publicGetEnumerator()實作,以及 GetEnumerator()的明確實作。 在此情況下, DataContractSerializer 會叫用 publicGetEnumerator()實作,而不是叫用 GetEnumerator()的明確實作。 如果所有 GetEnumerator() 實作都不是 public ,且都是明確的實作,則 DataContractSerializer 會叫用 IEnumerable.GetEnumerator()

當 WCF 在部分信任環境中執行時,對於集合型別來說,如果所有的 GetEnumerator() 實作都不是 public,或者全都不是明確的介面實作,則會擲回安全性例外狀況。

NetDataContractSerializer

在部分信任中, List<T>不支援許多 .NET Framework 集合型別,例如 ArrayListDictionary<TKey,TValue>HashtableNetDataContractSerializer 。 這些型別的 [Serializable] 屬性都已經過設定,如前面「序列化」一節所述,部分信任的環境不支援這個屬性。 DataContractSerializer 會以特殊方式處理集合,因此能夠解決這個限制,但 NetDataContractSerializer 沒有這類機制來避免這個限制。

在部分信任中, DateTimeOffset 不支援 NetDataContractSerializer 型別。

在部分信任中執行時,無法搭配 NetDataContractSerializer 使用代理 (透過 SurrogateSelector 機制)。 請注意,這個限制只適用於使用代理時,不適用於序列化代理時。

讓通用行為執行

當應用程式在部分信任環境中執行時,加入組態檔 <commonBehaviors> 區段但未以 AllowPartiallyTrustedCallersAttribute 屬性 (APTCA) 標記的服務或端點行為不會執行,並且發生這種情況時,也不會擲回例外狀況。 若要強制執行通用行為,您必須執行下列其中一項:

  • 使用 AllowPartiallyTrustedCallersAttribute 屬性標記您的通用行為,讓它可以在部署為部分信任應用程式時執行。 請注意,您可以在電腦上設定登錄項目,以防止已標記 APTCA 的組件執行。 .

  • 確定應用程式是否會部署為完全信任的應用程式,而使用者無法修改程式碼存取安全性設定以在部分信任環境中執行應用程式。 如果可以執行這項操作,行為就不會執行,也不會擲回例外狀況。 若要確定這一點,請參閱使用 Caspol.exe (程式碼存取安全性原則工具)levelfinal 選項。

如需通用行為的範例,請參閱操作說明:鎖定企業的端點

組態

部分信任程式碼只能載入本機 app.config 檔案中的 WCF 組態區段,但有一個例外。 若要載入參考 machine.config 或根 web.config 檔案中 WCF 區段的 WCF 組態區段,將需要 ConfigurationPermission(Unrestricted)。 少了這個權限,本機組態檔以外的 WCF 組態區段 (行為、繫結) 參考會在載入組態時導致例外狀況。

唯一的例外是序列化的已知型別組態,如本主題的「序列化」一節所述。

重要

只有在完全信任下執行時,才支援設定延伸。

診斷

事件記錄

在部分信任下,只支援有限的事件記錄。 只有服務啟動錯誤以及追蹤/訊息記錄失敗,才會記錄至事件記錄檔中。 處理序最多可以記錄 5 個事件數目,以避免事件記錄檔中寫入過多訊息。

訊息記錄

當 WCF 在部分信任環境中執行時,訊息記錄將無法運作。 如果在部分信任情況下啟用的話,儘管不會導致服務啟動失敗,但也無法記錄訊息。

追蹤

在部分信任環境中執行時,可使用受限制的追蹤功能。 在組態檔的 <listeners> 項目中,您可以新增的唯一型別就是 TextWriterTraceListener 和新的 EventSchemaTraceListener。 使用標準 XmlWriterTraceListener 可能導致不完整或不正確的記錄。

下列為支援的追蹤來源:

下列為不支援的追蹤來源:

您不應該指定下列 TraceOptions 列舉成員:

在部分信任環境中使用追蹤時,請確定應用程式擁有足夠的權限來儲存追蹤接聽項的輸出。 例如,使用 TextWriterTraceListener 將追蹤輸出寫入至文字檔時,請確定應用程式具有必要的 FileIOPermission 來順利寫入追蹤檔。

注意

為了避免在追蹤檔中大量出現重複錯誤,WCF 會在第一次安全性失敗之後停用資源或動作的追蹤。 第一次嘗試存取資源或執行動作時,會針對每個失敗的資源存取產生一個例外狀況追蹤。

WCF 服務主機

WCF 服務主機不支援部分信任。 如果您想要在部分信任情況下使用 WCF 服務,請勿使用 Visual Studio 中的 WCF 服務程式庫專案範本來建置服務。 反之,請選擇 WCF 服務網站範本在 Visual Studio 中建立新的網站,如此可在支援 WCF 部分信任的 Web 伺服器裝載服務。

其他限制

WCF 一般來說會受到裝載應用程式加諸其上的安全性考量限制。 例如,如果 WCF 是裝載於 XAML 瀏覽器應用程式 (XBAP),則會受限於各種 XBAP 限制,如 Windows Presentation Foundation Partial Trust Security(Windows Presentation Foundation 部分信任安全性) 一文中所述。

在部分信任環境中執行 indigo2 時,不會啟用下列額外的功能:

  • Windows Management Instrumentation (WMI)

  • 僅部分啟用事件記錄 (請參閱「 診斷 」一節中的討論)。

  • 效能計數器

在部分信任環境中使用不支援的 WCF 功能可能會導致執行階段出現例外狀況。

未列出的功能

在部分信任環境中執行時,要找到不可用的資訊片段或動作的最好方式,就是嘗試在 try 區塊內部存取資源或執行動作,然後捕捉 ( catch ) 失敗。 為了避免在追蹤檔中大量出現重複錯誤,WCF 會在第一次安全性失敗之後停用資源或動作的追蹤。 第一次嘗試存取資源或執行動作時,會針對每個失敗的資源存取產生一個例外狀況追蹤。

另請參閱