2011-05-07 63 views
30

我正在編寫WCF服務和他的客戶端。我想在服務和客戶端之間發送/接收自定義類的對象。是WCF所需的DataContract屬性

我有3個模塊

  • WCF服務
  • WCF客戶端
  • 共同類庫

兩個WCF服務和客戶端具有共同的類庫引用。 我不想用DataContract屬性標記所有的類。

所以,我的問題是「DataContract屬性是否需要WCF?」

我使用.NET 4和netTcpBinding。

回答

22

如果我正確地記得(IIRC),如果你不使用正式的數據契約標記,它默認採用字段串行器的方式。這會起作用,但不易版本化,因爲私人更改可能會破壞客戶端/服務器。國際海事組織你應該總是正式裝飾WCF類型的數據合同/數據成員屬性。它會在沒有它們的情況下工作,但是出於錯誤的原因(IIRC,原來它沒有沒有正式標記)。

+25

我真的認爲IIRC是一些技術術語。發現它意味着'如果我沒有記錯'。大聲笑! – thewpfguy 2013-02-06 04:08:50

+2

好吧,多年來我一直認爲它代表「如果我ReCall」,我想它更有意義的是,R和C代表不同的單詞。 – 2014-02-12 05:17:51

+2

http://msdn.microsoft.com/zh-cn/library/ms733127%28v=vs.110%29.aspx表示默認情況下,只有公共讀/寫屬性和字段包含在合同中。 – 2014-08-15 21:31:18

3

它使用DataContract屬性不是必需的,您的服務將工作得很好,沒有他們。

話雖如此,我真的不認爲你的服務和客戶共享一個類庫是最好的設計方法。如果您通過DataContracts公開您的類型,這將更清晰。

有一天,有人想要使用服務但無法訪問共享類庫時會發生什麼?

+0

只有我的客戶將使用該服務。 – user179437 2011-05-07 14:45:29

+0

當服務有一個方法([OperationContract]),它有我的自定義類的參數,並且該類沒有默認構造函數時,我收到來自WCF服務主機的InvalidDataContractException。 – user179437 2011-05-07 14:47:42

+0

即使您的服務和客戶端共享一個類庫,WCF也會嘗試序列化您的類型,並且需要一個默認構造函數。您的設計違反了Web服務設計的原則,我認爲您最好使用.NET遠程處理等其他方法。 – 2011-05-07 14:58:54

7

「是DataContract屬性需要 爲WCF」

從技術上講,沒有。這取決於您是否使用DataContractSerializer(這是許多綁定的默認值)。

還有其他的選擇:

  1. 考慮其他串行
  2. 嘗試使用Data Contract Surrogates(屬性仍然需要地方,但它確實有可能意味着美國可以留下您的類不變,如果多數民衆贊成有關)
  3. 依靠serialization defaults可以在沒有數據合同屬性的情況下序列化類時
+0

縮回ContractDescription建議。我懷疑你可以使用ContractDescription以某種方式更改序列化程序 – Schneider 2011-05-09 01:34:14