服務契約定義了遠端訪問物件和可供呼叫的方法,資料契約則是服務端和客戶端之間要傳送的自定義資料型別。
一旦宣告乙個型別為datacontract,那麼該型別就可以被序列化在服務端和客戶端之間傳送,如下所示。
[datacontract]
public class userinfo
只有宣告為datacontract的型別的物件可以被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。wcf對宣告為datacontract的型別提供更加細節的控制,可以把乙個成員排除在序列化範圍以外,也就是說,客戶端程式不會獲得被排除在外的成員的任何資訊,包括定義和資料。預設情況下,所有的成員屬性都被排除在外,因此需要把每乙個要傳送的成員宣告為datamember,如下所示。
[datacontract]
public class userinfo
[datamember]
public int age
[datamember]
public string location
public string zodiac
}上面這段**把userinfo類宣告為datacontract,將username、age、location這3個屬性宣告為datamember(資料成員)。zodiac成員沒有被宣告為datamember,因此在交換資料時,不會傳輸zodiac的任何資訊。
datacontract也支援name/namespace屬性,如同servicecontract,name和namespace可以自定義名稱和命名空間,客戶端將使用自定義的名稱和命名空間對datacontract型別進行訪問。
宣告為datamember的成員也可以自定義客戶端可見的名稱,例如:
[datamember(name="name")]
public string username
[datamember(name="age")]
public int userage
除了name和namespace以外,datamember還有以下引數,它們的含義分別如下。
(1)isrequired:值為true時,要求序列化引擎檢查物件是否存在該值;若無,則會有異常丟擲。
(2)order:bool型別值,值為true時,序列化和反序列化過程將會按成員定義的順序進行,這對依賴於成員位置的反序列化過程無比重要。
(3)emitdefaultvalue:為成員屬性設定乙個預設值。
一般情況下,將型別宣告為datacontract就可以滿足傳送的需求了,不過特殊情況是難以避免的,這時就需要對要傳送的soap訊息進行更加精確的控制,messagecontract可以滿足這種需求。
把乙個型別宣告為messagecontract,意味著它可以被序列化為soap訊息,可以宣告型別的成員為soap訊息的各個部分,如header、body等,如下所示。
[messagecontract]
public class usermessage
set
}[messageheader(
name = "authkey",
namespace = "",
mustunderstand = true
)]public string authkey
set }}
user成員被宣告為messagebody(訊息體)的乙個成員,authkey被宣告為訊息頭(messageheader)的乙個成員。這個類將可以生成如下的soap訊息。
messageheader中,mustunderstand引數表示讀取該頭的程式必須能夠識別頭的內容,否則不能繼續處理。name/namespace的作用與前面的元素相同。另有relay引數,若為true,頭的內容被接收到以後會在響應訊息中回發給訊息傳送端。
WCF中的資料契約(DataContract)
服務契約定義了遠端訪問物件和可供呼叫的方法,資料契約則是服務端和客戶端之間要傳送的自定義資料型別。一旦宣告乙個型別為datacontract,那麼該型別就可以被序列化在服務端和客戶端之間傳送,如下所示。datacontract public class userinfo 只有宣告為datacontr...
wcf資料契約
專案中需要使用繼承關係,乙個函式返回特定的子類,在序列化的時候需要告訴序列化器,在父類檔案中使用kowntype注釋即可。namespace healthadminwebservice.logic datamember public string exercisestep datamember pu...
談WCF資料契約疑問之共享資料契約
最近在做專案的時候,發現同乙個資料契約再客戶端隸屬於兩個不同的命名空間,為此如果兩個服務進行互動的時候會涉及到型別 的問題,互操作性很差,要進行不必要的拆和裝,在前面終於讓我找到了答案,下面我來描述一下這個場景,大家請看下面 實體類 大家請注意命名空間 using system using syst...