2012-08-15 79 views
2

我需要開發一個web服務,它將通過SOAP公開給java客戶端。我們有一個明確的架構,我們用它來在兩個系統之間進行通信。現在我需要在我的WCF合約上公開一個操作,它將Schema對象存儲在我們的數據庫中。DataContract問題

我按照以下步驟開發web服務。

  • 在WCF主機過來basichttp
  • 創建使用XSD.EXE
  • 以架構爲上的操作類似DoThis(SchemaObject模式)
參數架構的對象模型

由於這將在WCF中公開,我已經去掉並修改了xsd工具生成的對象模型。我們的模式具有多層嵌套,並且是4種不同模式的組合。由xsd工具生成的對象圖具有抽象類,繼承性等。

爲此,我已經在每個類上定義了DataContract屬性,並向它添加了名稱空間,該名稱空間已經存在於XmlTypeAttribute中。我還爲每個屬性添加了DataMemebers。

模式中的一些屬性是由工具使用xmlarrayitem屬性定義的數組。

現在,當我使用SOAP UI發送請求時,該對象沒有按預期得到反序列化。幾乎所有的字段都是空的,它具有某種繼承層次結構。我已將KnownType屬性添加到適當的數據合同中,但仍無法正常工作。

我的問題是:

  • 這是開發一個web服務的正確途徑。

  • 有沒有辦法避免把數據合同和數據成員放在一起,只用xsd工具添加的序列化屬性?

  • 是否有必要使用datacontract屬性,它不會與xmlserialization屬性一起工作,因爲它在xml反序列化的情況下起作用?

+0

有兩種開發Web服務的方法,寫入wsdl和xsd,然後根據它生成類/代碼。或相反亦然。有時爲了避免跨平臺客戶端和服務器的兼容性問題。我傾向於編寫數據合同,服務合同類並運行服務來生成wsdl和模式。這確保了序列化被照顧。另外,如果你有wsdl和schema,你是否嘗試使用svcutil生成wcf服務? – Dilberted 2012-08-15 01:07:37

+0

我會檢查您是否以正確的順序發送您的所有屬性,即按字母順序或以指定順序發送。 http://stackoverflow.com/questions/10474838/not-all-parameters-in-wcf-data-contract-make-it-through-the-web-service-call/10475117#10475117 – SCB 2012-08-15 01:40:14

回答

1

WCF支持兩種類型的序列化 - DataContractSerializerXmlSerializer

XSD.exe生成所有必需的XmlSerializer屬性的強類型實體。您不需要添加任何DataContractDataMemeber屬性以在WCF中處理生成的類。

查看MSDN瞭解更多的細節 - http://msdn.microsoft.com/en-us/library/ms733901.aspx

也必須非常小心與XSD.EXE生成你的實體。正如你可能已經看到的那樣,WCF服務器將會在這些文件中執行許多序列化更改,但這會對客戶端造成重大改變,因爲它們會在XSD上進行中繼。

如果可能的話,我會保留這些自動生成的實體而不做任何更改,以保證界面不被破壞。您可以引入單獨的DTO類以用於業務層。你可以在那裏實現繼承層次結構。

如果您覺得自動生成的類需要更改,則可以使用一堆單元測試。這些測試用例應該生成不同的數據集,將它們序列化爲XML並通過XSD檢查XML。

+0

+1關於部分串行器的選擇 – 2012-08-15 11:29:40

0

從技術上講,我沒有看到您實施該服務的方式有任何特定的缺陷。

但從架構的角度來看,這對我來說太複雜了。發送「平面」數據結構並隱藏其他地方的複雜性總是更容易。 我建議採取以下步驟

  1. 發展一些特殊的'運輸'計劃,最大限度地扁平化。當您的模型更改時,它使更改服務變得更容易。而且它也使得生成和處理xsd的痛苦減輕。
  2. 對通道兩側的特殊轉換器進行編碼,以將普通模型轉換爲「平面」,反之亦然。