2012-10-22 24 views
1

我有一個DataMember(isRequired:= True),該屬性名爲FillerInd。現在你怎麼知道該字段是空的還是不存在?我在網上閱讀,你必須做一些XML的序列化和反序列化,如果它有字段需要丟失它會拋出異常MissingMethodException。我不知道如何實現這一點,或者如果這是最佳路線。任何幫助把我帶入正確的道路我會非常感激。如何檢查是否存在已將isRequired設置爲true的WCF

回答

4

DataMember屬性IsRequired會告訴您電話上是否需要屬性:它是否應出現在消息中。這會導致異常的典型情況是服務通過添加屬性IsRequired = true來更新DataContract,而不通知客戶端。客戶端將發送不包含屬性的序列化對象,導致引發異常。

一個不太常見的情況,但使用基本類型的屬性重現此問題的簡單方法是明確地將EmitDefaultValue屬性設置爲false。如果您這樣做,然後嘗試使用該DataContract的對象調用操作,則可能會拋出異常。考慮下面這個例子:

// Data Contract 
[DataContract] 
public class Animal 
{ 
    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    public string Name; 
} 

// IService 
[OperationContract] 
int GetIdentifier(Animal animal); 

// Client operation 
int id = client.GetIdentifier(new Animal()); // Causes exception 

這將導致SerializationException(反過來導致的CommunicationException)與沿着這些路線的消息:

會員名稱型....動物不能被序列化。此異常通常是由於嘗試使用不允許空值的空值引起的。 'Name'成員被設置爲其默認值(通常爲null或零)。該成員的EmitDefault設置爲'false',表示該成員不應被序列化。但是,該成員的IsRequired設置爲'true',表示它必須被序列化。這個衝突無法解決。考慮將「名稱」設置爲非默認值。或者,您可以將DataMemberAttribute屬性上的EmitDefaultValue屬性更改爲true,或將IsRequired屬性更改爲false。

請注意,如果您繞過這個問題的客戶端(例如,通過使數據成員沒有在客戶端不再需要編輯一個生成的服務參考reference.cs),那麼該服務會遇到異常時反序列化,我相信這會導致錯誤。


轉到您的具體評論和問題。

您不必做任何事情來判斷該字段是否爲空:WCF框架將爲您處理此問題。如果需要,我想你可以掛鉤(de)序列化來解決這個問題,甚至在處理之前檢查它。

正如我所說的,這種情況將導致SerializationExceptions和CommunicationExceptions,而不是MissingMethodException

您是否需要「IsRequired」以及它是否是「最佳路線」,我不知道。當然,這取決於你的情況。

+0

因此,如果我正確理解這一點,並且將一個類用作方法的參數,並且客戶端將調用該方法,則它將在發送時引發異常?或者我明白'EmitDefaultValue'錯誤? – Silvermind

+1

是的,afaik就是這樣發生的。對於clafiry:如果您嘗試發送(並因此序列化)未設置必需屬性並且EmitDefaultValue爲false的對象,* WCF *客戶端將拋出異常。如果你有一個繞過這個的客戶端,那麼* service *會在反序列化時拋出一個異常。 – Jeroen

+0

我剛剛測試過它,但並不完全正確(沒有冒犯)。如果它被設置爲默認值,它將引發異常。如果我用'Required = true,EmitDefaultValue = false'標記一個布爾值,並且我將客戶端顯式的布爾值設置爲'false',它仍然會拋出異常。當然是合乎邏輯的。服務人員無法知道該屬性是否真正設置爲沒有反應狀態。對於值類型,我可以堅持'Nullable '在這種情況下,對於字符串和類我可以區分'String.Empty'和'null'。謝謝強硬,這真的很有幫助。 – Silvermind

相關問題