[轉]資料契約(DataContract)

來源:互聯網
上載者:User

標籤:http   io   os   使用   sp   on   資料   bs   cti   

服務契約定義了遠端存取對象和可供調用的方法,資料契約則是服務端和用戶端之間要傳送的自訂資料類型。

一旦聲明一個類型為DataContract,那麼該類型就可以被序列化在服務端和用戶端之間傳送,如下所示。

      [DataContract]

     public class UserInfo

     {

          //….

}

只有聲明為DataContract的類型的對象可以被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。WCF對聲明為DataContract的類型提供更加細節的控制,可以把一個成員排除在序列化範圍以外,也就是說,用戶端程式不會獲得被排除在外的成員的任何資訊,包括定義和資料。預設情況下,所有的成員屬性都被排除在外,因此需要把每一個要傳送的成員聲明為DataMember,如下所示。

    [DataContract]

    public class UserInfo

    {

        [DataMember]

        public string UserName

        {

            get;

            set;

        }

        [DataMember]

        public int Age

        {

            get;

            set;

        }

        [DataMember]

        public string Location

        {

            get;

            set;

        }

        public string Zodiac

        {

            get;

            set;

        }

}

上面這段代碼把UserInfo類聲明為DataContract,將UserName、Age、Location這3個屬性聲明為DataMember(資料成員)。Zodiac成員沒有被聲明為DataMember,因此在交換資料時,不會傳輸Zodiac的任何資訊。

DataContract也支援Name/Namespace屬性,如同ServiceContract,Name和Namespace可以自訂名稱和命名空間,用戶端將使用自訂的名稱和命名空間對DataContract類型進行訪問。

聲明為DataMember的成員也可以自訂用戶端可見的名稱,例如:

[DataMember(Name="Name")]

public string UserName

{

     get;

     set;

}

[DataMember(Name="Age")]

public int UserAge

{

          get;

          set;

}

除了Name和Namespace以外,DataMember還有以下參數,它們的含義分別如下。

(1)IsRequired:值為true時,要求序列化引擎檢查對象是否存在該值;若無,則會有異常拋出。

(2)Order:bool類型值,值為true時,序列化和還原序列化過程將會按成員定義的順序進行,這對依賴於成員位置的還原序列化過程無比重要。

(3)EmitDefaultvalue:為成員屬性設定一個預設值。

一般情況下,將型別宣告為DataContract就可以滿足傳送的需求了,不過特殊情況是難以避免的,這時就需要對要傳送的SOAP訊息進行更加精確的控制,MessageContract可以滿足這種需求。

把一個型別宣告為MessageContract,意味著它可以被序列化為SOAP訊息,可以宣告類型的成員為SOAP訊息的各個部分,如Header、Body等,如下所示。

    [MessageContract]

    public class UserMessage

    {

        private string user = String.Empty;

        private string authKey = String.Empty;

        [MessageBodyMember(

          Name = "UserName",

          Namespace = "http://www.wcf.com")]

        public string User

        {

            get { return user; }

            set { user = value; }

        }

        [MessageHeader(

          Name = "AuthKey",

          Namespace = "http://www.wcf.com",

          MustUnderstand = true

        )]

        public string AuthKey

        {

            get { return authKey; }

            set { this.authKey = value; }

        }

}

User成員被聲明為MessageBody(訊息體)的一個成員,AuthKey被聲明為訊息頭(MessageHeader)的一個成員。這個類將可以產生如下的SOAP訊息。

<s:Envelope>

    <s:Header>

        <a:Action s:mustUnderstand="1">http://UserMessage/Action</a:Action>

        <h:AuthKey s:mustUnderstand="1" xmlns:h="http://www.wcf.com">xxxx</h:AuthKey>

    </s:Header>

    <s:Body>

        <UserMessage xmlns="Microsoft.WCF.Documentation">

             <User xmlns="http://www.wcf.com">abcd</User>

       </UserMessage>

    </s:Body>   

</s:Envelope>

 

MessageHeader中,MustUnderstand參數表示讀取該頭的程式必須能夠識別頭的內容,否則不能繼續處理。Name/Namespace的作用與前面的元素相同。另有Relay參數,若為true,頭的內容被接收到以後會在響應訊息中回傳給訊息發送端。

[轉]資料契約(DataContract)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.