2009-09-02 111 views
20

我想拋出自定義異常,如一些錯誤消息作爲WCF Web服務的異常,並試圖在調用Web服務方法的客戶端應用程序中接收此異常錯誤消息。WCF Web服務客戶端自定義異常錯誤

如何從WCF Web Service中拋出自定義異常並在客戶端接收到相同的異常錯誤。

WCF Web服務方法:

public bool Read() 
    { 
     if (IsUserValid() == false) 
     { 
      throw new Exception("Authorized user"); 
     } 
    } 

在客戶端

try 
{ 
    _client.Read(); 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
    return; 
} 

結果:總是拋出錯誤信息作爲異常**即。

「System.ServiceModel.FaultException: 服務器由於內部錯誤無法處理的 請求有關錯誤 的更多信息,或者 打開 IncludeExceptionDetailInFaults(無論是從ServiceBehaviorAttribute 或從。 配置 行爲)在服務器上以 發送異常信息返回到 客戶端,或打開跟蹤 Microsoft .NET Framework 3.0 SDK 文檔並檢查s erver 跟蹤日誌「。

這是代碼拋出異常,但沒有返回相同的錯誤消息從WCF Web服務作爲異常拋出錯誤

請建議

+0

可以在類似的問題找到答案:http://stackoverflow.com/questions/5165004/wcf-data-service-error-handling/8225049#8225049 – 2011-12-23 04:13:10

回答

2

爲了得到這個工作,你需要做兩件事情:

  • 定義在接口故障合同(合同WCF)
  • 拋出異常作爲錯誤異常
+0

-1這個鏈接是死 – 2012-10-11 17:00:04

69

在WCF中,您不應該拋出標準的.NET異常 - 這與WCF的潛在互操作性質背道而馳 - 畢竟,您的客戶端可能是一個沒有.NET異常概念的Java或PHP客戶端。

相反,您需要拋出FaultExceptions(這是WCF的標準行爲)。

如果你想傳達回什麼地方出了錯更多信息,看看通用FaultException<T>類型:

SERVER:

public bool Read() 
{ 
    if (IsUserValid() == false) 
    { 
     throw new FaultException<InvalidUserFault>("User invalid"); 
    } 
} 

或可替代(由@MortenNorgaard的建議):

public bool Read() 
{ 
    if (!IsUserValid()) 
    { 
     InvalidUserFault fault = new InvalidUserFault(); 
     FaultReason faultReason = new FaultReason("Invalid user"); 

     throw new FaultException<InvalidUserFault>(fault, faultReason); 
    } 
} 

客戶端

try 
{ 
    _client.Read(); 
} 
catch (FaultException<InvalidUserFault> e) 
{ 
    MessageBox.Show(e.Message); 
    return; 
} 

你應該申報的InvalidUserFault爲WCF數據契約並定義成員可能會前往什麼時候回來與該類型(即錯誤代碼,錯誤消息等)。

[DataContract] 
[Serializable()] 
public class BusinessFault 
{ 
    ... add your fault members here 
} 

然後,你應該裝點與可能的故障您的服務方法它可以拋出:

[FaultContract(typeof(InvalidUserFault)] 
[OperationContract] 
public bool Read() 
..... 

當然,「quick'n'dirty」黑客是簡單地定義服務器返回在其FaultExceptions異常詳細信息:

<serviceBehaviors> 
    <behavior name="EmployeeManager_Behavior"> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
</serviceBehaviors> 

,然後你可以檢查的FaultException的.Detail對於發生在服務器上實際的異常 - 但是:這更像是一個開發時間,而不是真正的解決方案。

馬克

+0

大回答。 +1 – dcw 2009-10-07 22:50:44

+1

this'throw new FaultException (「User invalid」);'無效,您需要在ctor中傳入實際的'InvalidUserFault'。 – jajdoo 2015-03-29 05:47:31

+0

我會建議以下內容,因爲錯誤原因似乎是SOAP規範所要求的(參考http://stackoverflow.com/questions/9614992/throwing-a-faultexceptiont-from-a-wcf-services-causes-the -creator-的此結果FAU) 公共BOOL讀() { 如果(IsUserValid()== FALSE) { InvalidUserFault故障=新InvalidUserFault(); FaultReason faultReason = new FaultReason(「Invalid user」); throw new FaultException (fault,faultReason); } } – 2016-01-14 13:20:38