下面是我如何得到它的工作..不知道它是否是正確的方式。 我找不到任何明確的指導說明,您不應該使用Exception子類型作爲FaultException<TDetail>
中的TDetail參數。
我試着扔了一個FaultException<FileNotFoundException>
,發現文件名字段實際上是正確傳播的。
那麼FileNotFoundException和MyCustomException之間的增量是多少?
由於基座例外實現ISerializable的,我在服務器端不得不覆蓋的方法 ..
protected MyCustomException(SerializationInfo info, StreamingContext context) :
base(info, context)
{
this.From = info.GetString("From");
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("From", this.From);
}
我然後用於SvcUtil工具生成客戶端代理類。我發現沒有生成FileNotFoundException(因爲它是一個內置類型),但MyCustomException是。但它沒有任何字段,只有一個空的反序列化ctor。
我沒有深入到早期的ISerializable,因爲當我在代理類ctor中設置斷點時,它沒有被擊中。我錯誤地中止了調查的這一行(無法看到類的DebuggerStepThrough屬性和GeneratedCode屬性;由svcutil添加)。
所以我當時手動編輯自動生成的類添加字段並設置它在像這樣的構造函數..
[System.SerializableAttribute()]
public partial class MyCustomException : System.Exception
{
public string From { get; private set; } // manual edit
public MyCustomException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) :
base(info, context)
{
this.From = info.GetString("From"); // manual edit
}
}
現在它按預期工作;現場數據完好無損。
這引發了另一個問題:爲什麼代理生成步驟不會自動執行此操作?
此鏈接具有我使用DataContractAttribute標記異常子類型時看到的確切錯誤消息。 http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/5fdfc1d7-89f2-4f8b-a491-d9ac2cb0600c/看起來WCF應該支持ISerializable模型,那麼爲什麼不MyCustomException什麼時候用SerializableAttribute標記工作? – Gishu 2012-07-19 07:20:34
找到了我的問題的答案 - 由於基類型的異常實現ISerializable ..派生類型也必須遵守和覆蓋序列化其特定的字段。 – Gishu 2012-07-19 10:10:18