WCF中的資料契約(DataContract)

2021-09-06 19:51:07 字數 2090 閱讀 5710

服務契約定義了遠端訪問物件和可供呼叫的方法,資料契約則是服務端和客戶端之間要傳送的自定義資料型別。

一旦宣告乙個型別為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資料契約

專案中需要使用繼承關係,乙個函式返回特定的子類,在序列化的時候需要告訴序列化器,在父類檔案中使用kowntype注釋即可。namespace healthadminwebservice.logic datamember public string exercisestep datamember pu...

WCF中的資料契約和服務契約

1 服務契約定義了遠端訪問物件和可供呼叫的方法 servicecontract特性允許應用到介面或類上。當介面應用了servicecontract特性後,需要定義類實現該介面 然後使用乙個或多個類 或介面 方法中的 operationcontract 屬性定義協定的服務操作 通俗的說,給乙個類或者是...

WCF揭秘 共享資料契約

當客戶端引用wcf服務時,必須為服務定義乙個唯一的命名空間。在預設情況下,這個服務中所用到的類會被匯入到這個命名空間內。這樣,在不同的服務內引用同乙個資料契約時就會遇到乙個問題 在客戶端,同乙個資料契約被匯入到不同的命名空間中,無法實現轉換。在以下例子中,personservice與contract...