共用方式為


指定與處理合約和服務中的錯誤

Windows Communication Foundation (WCF) 應用程式會將 Managed 例外狀況物件對應至 SOAP 錯誤物件,並將 SOAP 錯誤物件對應至 Managed 例外狀況物件來處理錯誤情況。本節中的主題討論如何設計合約以將錯誤條件公開為自訂 SOAP 錯誤、如何將此類錯誤當成服務實作的一部份傳回,以及用戶端如何捕捉此類錯誤。

錯誤處理概觀

在所有 Managed 應用程式中,處理錯誤由 Exception 物件表示。在 SOAP 應用程式中 (如 WCF 應用程式),服務方法使用 SOAP 錯誤訊息來溝通處理錯誤資訊。SOAP 錯誤是包含在服務作業之中繼資料內的訊息類型,因此會建立錯誤合約,而用戶端可使用該合約來讓其作業更穩定或更具互動性。此外,由於已透過 XML 格式將 SOAP 錯誤公開給用戶端,現在這個類型的系統已經具備高度互通性,可供任何 SOAP 平台使用並擴充您的 WCF 應用程式應用範圍。

由於 WCF 應用程式必須同時在兩種錯誤系統類型下執行,任何一個傳送至用戶端的 Managed 例外狀況資訊必須從例外狀況轉換為服務中的 SOAP 錯誤並加以傳送,然後再從 SOAP 錯誤轉換為 WCF 用戶端中的錯誤例外狀況。在雙工用戶端的情況當中,用戶端合約也可能會將 SOAP 錯誤傳回服務。不管哪種情況,您都可以使用預設的服務例外狀況行為,或明確地控制是否要將例外狀況對應到錯誤訊息,以及其對應方式。

您可以傳送兩種類型的 SOAP 錯誤:「已宣告」(Declared) 和「未宣告」(Undeclared)。已宣告的 SOAP 錯誤是其中作業具有指定自訂 SOAP 錯誤類型之 System.ServiceModel.FaultContractAttribute 屬性的 SOAP 錯誤。未宣告 SOAP 錯誤則不會在作業的合約中指定。

我們強烈建議,服務作業應使用 FaultContractAttribute 屬性正式指定用戶端在正常作業期間可能收到的所有 SOAP 錯誤,以宣告其錯誤。我們也建議您只在 SOAP 錯誤中傳回用戶端應該知道的資訊,將資訊暴露的程度降至最低。

一般來說,服務 (與雙工用戶端) 會採取下列步驟,成功地將錯誤處理整合到應用程式中:

  • 將例外狀況條件對應至自訂 SOAP 錯誤。
  • 用戶端與服務會將 SOAP 錯誤當成例外狀況來傳送與接收。

此外,WCF 用戶端與服務可以使用未宣告的 SOAP 錯誤做為偵錯用途,同時延伸預設的錯誤行為。下列各節將說明這些工作與概念。

將例外狀況對應至 SOAP 錯誤

建立可以處理錯誤情況的作業的第一步,就是決定用戶端應用程式在哪種情況下應該收到有關錯誤的通知。某些作業會有專屬自身功能的一些錯誤情況。例如,PurchaseOrder 作業可能會將特定資訊傳回給已經無法再初始化採購單的客戶。在其他情況中 (例如 Calculator 服務),更常見的 MathFault SOAP 錯誤也許能夠說明整個服務的所有錯誤情況。一旦識別出您服務用戶端的錯誤情況,就可以建構自訂 SOAP 錯誤,並在引發 SOAP 錯誤的對應錯誤情況時將作業標示為傳回該 SOAP 錯誤。

如需 開發您的服務或用戶端的步驟完整資訊,請參閱定義並指定錯誤

用戶端與服務會將 SOAP 錯誤當成例外狀況來處理。

要在 WCF 應用程式中成功處理錯誤的第一步,就是辨識作業錯誤情況、定義自訂 SOAP 錯誤,並將這些作業標示為傳回這些錯誤。下一步則是適當地實作這些錯誤的傳送與接收作業。一般來說,服務會傳送錯誤以通知用戶端應用程式有關錯誤的情況,但是雙工用戶端可以同時將 SOAP 錯誤傳送給服務。

如需詳細資訊,請參閱 傳送和接收錯誤

未宣告的 SOAP 錯誤與偵錯

已宣告的 SOAP 錯誤非常適合用來建置穩固、可互通,與分散式應用程式。但是,在某些情況下則適合透過服務 (或雙工用戶端) 來傳送未宣告的 SOAP 錯誤,此錯誤並未在該作業的 Web 服務描述語言 (WSDL) 中提及。例如,當您開發服務時,一旦碰到未預期的情況,就可以將資訊傳回用戶端以便進行偵錯。此外,您可以將 System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults 屬性或 System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults 屬性設為 true 以允許 WCF 用戶端取得有關內部服務作業例外狀況的資訊。傳送和接收錯誤一文說明同時傳送個別錯誤與設定偵錯行為屬性。

ms733721.Important(zh-tw,VS.90).gif 注意:
由於 Managed 例外狀況會暴露內部應用程式資訊,所以將 System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaultsSystem.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults 設為 true,便可讓 WCF 用戶端取得內部服務作業例外狀況的相關資訊,包括個人識別資訊或其他敏感資訊。

因此,若您只是暫時對服務應用程式進行偵錯,才建議把 System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaultsSystem.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults 設為 true。此外,若某個方法以這種方式傳回未處理的 Managed 例外狀況,則該方法的 WSDL 不會包含 ExceptionDetail 型別之 FaultException 的合約。用戶端必須接受有未知 SOAP 錯誤 (以 System.ServiceModel.FaultException 物件的形式傳回給 WCF 用戶端) 的可能性,才能正確取得偵錯資訊。

使用 IErrorHandler 自訂錯誤處理

如果您有特殊需求,需要在發生應用程式層級例外狀況時自訂給用戶端的回應訊息,或是在傳回回應訊息後執行某些自訂處理,請實作 System.ServiceModel.Dispatcher.IErrorHandler 介面。

請參閱

參考

FaultException
FaultContractAttribute
FaultException
XmlSerializer
XmlSerializerFormatAttribute
FaultContractAttribute
CommunicationException
Action
Code
Reason
SubCode
IsOneWay

概念

定義並指定錯誤