2012-03-05 99 views
2

我有一個WCF服務,而我抓住了SQLEXCEPTION,然後返回它作爲這樣WCF的FaultException <SQLEXCEPTION>釣到的CommunicationException

throw new FaultException<SqlException>(...); 

一個FaultException異常而在客戶端,我抓住它這樣

catch (FaultException<SqlException> e) 
{ 
    // do something with exception 
} 
catch (FaultException<Exception> e) 
{ 
    // do something with exception 
} 

我不相信我有我在服務端或客戶端(一個winform客戶端)在app.config web.config中的一個問題,因爲我能夠趕上FaultException<ArgumentException>FaultException<Exception>等,但不FaultException<SqlException>

我沒有發現任何表明我無法通過的SQLExceptions到客戶端,我的操作合同是正確的東西像[FaultContract(typeof(SqlException))]配置,並[FaultContract(typeof(Exception))]

沒有人見過這個或知道我不能(或者可能需要做一些特殊的事情)將SqlException類型的錯誤傳遞給客戶端?謝謝。

+0

抱歉生根粉以前的評論的一些奇怪的神器。我不認爲你可以發送stacktrace回客戶端。 – Asdfg 2012-03-05 22:17:51

回答

3

throw new FaultException<Exception>實際上並不打算如何使用WCF故障系統。您指定的類型在SOAP錯誤的<Detail>元素中通過連線進行序列化。通常,這種類型是您編寫的WCF數據契約類,例如

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

throw new FaultException<Exception>發生的工作,因爲Exception[Serializable],而DataContractSerializer能夠處理[Serializable]類型以及[DataContract]類型。

但是,這種方法存在嚴重的侷限性。 DataContractSerializer不能很好地處理[Serializable]類型。只有原始類型的字段(string,int等)將被正確傳輸。這對於一個非常簡單的異常類型來說確實可行,但對於像SqlException這樣的複雜類型來說,這還不夠好。

我建議的解決方案是:創建您自己的專用數據合同,以傳回您需要的SqlException的數據,然後丟棄它。事實上,對於所有的異常類型,這是更安全和更好的做法。我使用Enterprise Library Exception Shielding自動處理。所有返回給客戶端的是一個GUID值,用於標識服務器日誌中的錯誤數據。

或者,如果您決定違規例外,請參閱this detailed article

0

我遇到了這個問題,因爲我在錯誤的地方有一個斷點。我用Debug..Delete all BreakpointsCtrl-Alt-F9)刪除了所有斷點,並且所有的CommunicationException異常都消失了,並被返回的正確消息所取代。

是的,超時時間爲60秒,所以這不應該發生,所以它可能是Visual Studio的2012年

相關問題