2012-03-15 67 views
1

對於一個客戶,我們正在開發一些WCF Web服務。我們的消息協定是通過在我們的類及其屬性之上使用DataContract和DataMember屬性來定義的。 DataMember屬性具有一些額外的屬性,允許我們添加一些額外的規則。例如,如果某個屬性應該始終可用,那麼我們使用(IsRequired = true);以表明這一點。收到或發送消息時會檢查這些規則。WCF IsRequired屬性困境

[DataContract] 
public class TestClass  
{ 
    [DataMember(IsRequired = true)] 
    public int RequiredValue { get; set; }  
} 

但是我們的測試過程中,我們注意到,這是行不通的,因爲在客戶端的RequiredValueField由空初始化,因此有一定的閱讀,我發現這個屬性,EmitDefaultValue = false,所以同時使用,我得到期望的結果

[DataContract] 
public class TestClass 
{ 
     [DataMember(IsRequired = true, EmitDefaultValue=false)] 
     public int RequiredValue { get; set; } 
} 

但假設,如果某些客戶端初始化RequiredValue = 0,然後調用服務的方法,它再次給了錯誤。 那麼如何使用一個選項來釋放我的API用戶,使他們可以傳遞此成員中的任何東西,包括零,但是當它們忽略時,只有它應該給出錯誤

回答

1
  1. 你還沒有提到你的「期望」結果是什麼。我的意思是你試圖達到的目標。
  2. 您是否知道MS不建議將EmitDefaultValue設置爲false,除非它是絕對必要的?請閱讀this MSDN page的最後部分以瞭解原因。
  3. 當您將EmitDefaultValue設置爲false時,爲您的服務生成的WSDL具有一些僅由WCF理解的註釋。即通過這樣做,您可能會限制您的服務的互用性。這是你的要求嗎?

解決問題的方法:

讓您的數據成員 「RequiredValue」 可爲空的int值。

[DataMember(IsRequired = true,EmitDefaultValue=false)] 
    public int? RequiredValue { get; set; } 

通過這樣做,RequiredValue數據成員的默認值將是null,你將可以設置爲零(0)沒有任何問題。