2014-01-06 250 views
2

我需要從WCF異常拋出,而不顯示堆棧跟蹤到客戶端,只是消息的例外......WCF而不顯示堆棧跟蹤

拋出新的FaultException(「EX1」);

我平均有20個例外字符串。 如何實現它而不必每次投擲的FaultException用字符串參數,而是一個異常對象

FaultException_i i = 1...20 
+0

您是否嘗試過使用[FaultException異常的通用版本(http://msdn.microsoft.com/ EN-US /庫/ ms576199(v = vs.110)的.aspx)?請參閱[拋出通用FaultException](http://stackoverflow.com/questions/648084/throwing-generic-faultexception) –

+0

@RuiJarimba - 是的,我明白了。在我的情況下,硬編碼的消息將被報告給客戶端。我如何定義這樣的例外? – Yakov

+1

請參閱Cyber​​maxs的回答 –

回答

4

當使用WCF服務,你必須使用FaulException因爲它是處理錯誤的本地肥皂的方法。但是,並不是所有的異常都能正確實現wcf序列化。

異常詳細信息(包括堆棧跟蹤)不應該暴露給客戶端。 你可以很容易地關掉這個在配置:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <services> 
     <service name="MyService" 
       behaviorConfiguration="MyServiceBehavior" > 
      .... 
     </service> 
    </services> 
</system.serviceModel> 

另外,我generaly使用自定義數據合同將包含異常信息。

[DataContract] 
public class MyFault 
{ 
    [DataMember] 
    public int Code { get; set; } 
    [DataMember] 
    public string Message { get; set; } 
} 

然後,我只是拋出一個泛化的錯誤是這樣的:

var myFault = new MyFault() 
     { 
      Code = ErrorCode.UnhandledException 
      Message = ex.Message, 
     }; 
... 
throw new FaultException<MyFault>(myFault); 
+1

請注意:['includeExceptionDetailInFaults']的默認值(http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.includeexceptiondetailinfaults(v = vs.110).aspx )是** false ** – GSerjo

+1

當然,但有時會用真實的方式進行生產:-) – Cybermaxs