2012-10-25 42 views
0

我正在編寫一個WCF客戶端以與JAX-WS Web服務進行通信。基本上與服務工作溝通。但是當調查由WCF客戶端生成的XML時,缺少一些元素。所有的屬性都正確生成,我已經在我的代碼中設置了它們。我是WCF和Web服務的新手,所以我有問題來分析這裏可能會出現什麼問題。什麼會導致XML中缺少的元素?我注意到所有這些缺少的屬性唯一的共同點是它們是枚舉類型。但除此之外,我什麼也沒找到。例如有一個國家代碼的枚舉。一個實體具有該枚舉類型的3個屬性。在XML中僅生成3個相關元素中的一個。由WCF客戶端生成的XML缺少一些元素

感謝您的幫助。

回答

1

這很可能發生,因爲WCF合約對待枚舉的方式不同。對於數據合同,您使用DataContract屬性標記該類,並使用DataMember屬性標記該成員。衆所周知的是,枚舉具有自己的屬性,稱爲EnumMember,WCF用它來正確地序列化它們。

有一篇名爲Enumeration Types in Data Contracts的MSDN文章,詳細介紹了該用法。從文章的示例代碼顯示了一個枚舉合同應該是什麼樣子:

[DataContract] 
public class Car 
{ 
    [DataMember] 
    public string model; 
    [DataMember] 
    public CarConditionEnum condition; 
} 

[DataContract(Name = "CarCondition")] 
public enum CarConditionEnum 
{ 
    [EnumMember] 
    New, 
    [EnumMember] 
    Used, 
    [EnumMember] 
    Rental, 
    Broken, 
    Stolen 
} 

注意,在他們的榜樣(這我上面附帶),您可以設置只枚舉值的子集的一部分數據合同,如果這是一個要求。

除此之外,沒有標記爲DataMember屬性的任何屬性將不會通過線路序列化。這應該是確保序列化適用於WCF的清單:

  1. 檢查類是否標有DataContract屬性。
  2. 檢查屬性是否標有DataMember屬性。
  3. 檢查單個枚舉值是否標有EnumMember屬性。
+0

感謝您的幫助。我自動生成代理和數據類,所以WCF應該照顧這個嗎?但是,我手動編輯了Re​​ference.cs並添加了您建議的屬性,但沒有任何更改。 – chrinetr

+0

您創建的WCF端點或與外部JAX-WS Web服務的連接是否存在錯誤?如果是JAX-WS Web服務,您是否可以將枚舉發送到WCF之外? –

+0

我找到了解決方案。如果您爲它們分配了值,則有幾個屬性需要設置相關的屬性。例如,可能有Foobar元素和另一個IsFoobarSet。只有當IsFoobarSet = true時,Foobar元素纔會被創建。不要問我爲什麼這樣實施。看起來對我來說很不尋常,但我對這個東西很陌生,所以這可能是一個超級邏輯的理由。 – chrinetr