我有一個DataMember(isRequired:= True),該屬性名爲FillerInd。現在你怎麼知道該字段是空的還是不存在?我在網上閱讀,你必須做一些XML的序列化和反序列化,如果它有字段需要丟失它會拋出異常MissingMethodException。我不知道如何實現這一點,或者如果這是最佳路線。任何幫助把我帶入正確的道路我會非常感激。如何檢查是否存在已將isRequired設置爲true的WCF
回答
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」以及它是否是「最佳路線」,我不知道。當然,這取決於你的情況。
- 1. 檢查值是否設置爲true並且爲true true
- 2. 檢查環境變量是否存在並設置爲True
- 3. 如何檢查WaitHandle是否已設置?
- 4. 如何檢查LogWriter是否已設置?
- 5. 如何將XmlAttribute設置爲IsRequired?
- 6. 如何檢查自定義類型是否設置爲nullable = True
- 7. 爲什麼有些屬性將isRequired設置爲true?
- 8. 檢查isset是否爲true?
- 9. 如何在我的bashrc中檢查是否已設置別名
- 10. 如何檢測$ _POST是否已設置?
- 11. 檢查GET變量是否已設置
- 12. 檢查JSP片段是否已設置
- 13. Python Django檢查屬性是否存在或已設置
- 14. 如何在PHP中檢查變量是否已設置且is_null
- 15. 如何檢查infoWindow是否已設置並在地圖上?
- 16. 在Activiti中,如何檢查變量是否已設置?
- 17. Actionscript 3 - 如何檢查陣列位置是否已經存在
- 18. 如何在設置multipleSiteBindingsEnabled爲true時設置WCF應用程序
- 19. 你將如何檢查一行是否已經存在jquery
- 20. 如何將spring mongodbtemplate檢查對象是否已經存在
- 21. 如何檢查是否爲存儲庫設置了svn external
- 22. 如何檢查命令行中的參數是否已設置?
- 23. 檢查WCF服務是否存在
- 24. 如何在設置之前檢查圖像是否存在?
- 25. 如何檢查是否已保存的進口與VBA存在
- 26. PHPMAILER,IsHTML已設置爲true
- 27. 如何檢查我是否已經設置了uncaughtException事件
- 28. 如何檢查環境變量是否已設置?
- 29. 如何檢查外觀屬性是否已設置?
- 30. VBA如何檢查變量是否已設置?
因此,如果我正確理解這一點,並且將一個類用作方法的參數,並且客戶端將調用該方法,則它將在發送時引發異常?或者我明白'EmitDefaultValue'錯誤? – Silvermind
是的,afaik就是這樣發生的。對於clafiry:如果您嘗試發送(並因此序列化)未設置必需屬性並且EmitDefaultValue爲false的對象,* WCF *客戶端將拋出異常。如果你有一個繞過這個的客戶端,那麼* service *會在反序列化時拋出一個異常。 – Jeroen
我剛剛測試過它,但並不完全正確(沒有冒犯)。如果它被設置爲默認值,它將引發異常。如果我用'Required = true,EmitDefaultValue = false'標記一個布爾值,並且我將客戶端顯式的布爾值設置爲'false',它仍然會拋出異常。當然是合乎邏輯的。服務人員無法知道該屬性是否真正設置爲沒有反應狀態。對於值類型,我可以堅持'Nullable'在這種情況下,對於字符串和類我可以區分'String.Empty'和'null'。謝謝強硬,這真的很有幫助。 –
Silvermind