对于SOAP来说主要由两部分构成Header和Body,他们两个共同构成了SOAP的信封,通常来说Body保存具体的数据内容,Header保存一些上下文信息或关键信息。

  比如:在一些情况下,具有这样的要求:当序列化一个对象并生成消息的时候,希望将部分数据成员作为SOAP的报头,部分作为消息的主体。比如说,我们有一个服务操作采用流的方式进行文件的上载,除了以流的方式传输以二进制表示的文件内容外,还需要传输一个额外的基于文件属性的信息,比如文件格式、文件大小等。一般的做法是将传输文件内容的流作为SOAP的主体,将其属性内容作为SOAP的报头进行传递。这样的功能,可以通过定义消息契约来实现。

  由此可见,MessageContract的主要作用就是给我们提供了自己来操作SOAP的一种方式。

  MessageContractAttribute:对控制消息头和消息体元素提供了强力支持。
  所支持的属性: MessageHeaderAttribute 和 MessageBodyMemberAttribute。
  用于及用途:
  [1] 添加自定义头(custom headers);
  [2] 控制消息是否被包装;
  [3] 控制签名与加密;

一、[MessageContract]:

  [1] 将一个类型转换为SOAP消息
  类型可以包含消息头和消息体的元素
  [2] 能够设置IsWrapped, ProtectionLevel
  [3] 可以设置显式Name, Namespace

  如下面的代码:

[MessageContract(IsWrapped=true, ProtectionLevel=ProtectionLevel.Sign)]
public class SaveLinkRequest
{…}
[MessageContract]
public class SaveLinkResponse
{…}

 

二、[MessageHeader]:

  1 应用到消息契约的域(fields)或者(properties)
  为创建自定义头提供了简单的方法
  2 能够提供Name, Namespace, ProtectionLevel
  3 可以设置SOAP协议的设置:Relay, Actor,MustUnderstand

三、[MessageBody]:

  [1] 应用到消息契约的域(fields)或者属性(properties)
  [2] 能够拥有多个body元素
– 等价于在操作中拥有多个参数
– 返回多个复杂类型数据的唯一方法
• 总是提供顺序(Order)
• 可以设置Name, Namespace, ProtectionLevel

[MessageContract(IsWrapped = true, ProtectionLevel = ProtectionLevel.Sign)]
public class SaveEventRequest
{
    private string m_licenseKey;
    private LinkItem m_linkItem;
    [MessageHeader(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
    public string LicenseKey
    {
        get { return m_licenseKey; }
        set { m_licenseKey = value; }
    }
    [MessageBodyMember]
    public LinkItem LinkItem
    {
        get { return m_linkItem; }
        set { m_linkItem = value; }
    }
}
[MessageContract]
public class SaveEventResponse
{
}

 

 

那么如何应用消息契约那?不要急,下面来介绍,还是来看代码吧:

WCF 之 消息契约(MessageContract)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace ContentTypes
{
    [DataContract]
    public class LinkItem
    {
        private long m_id;
        private string m_title;
        private string m_description;
        private DateTime m_dateStart;
        private DateTime m_dateEnd;
        private string m_url;

        [DataMember]
        public long Id
        {
            get { return m_id; }
            set { m_id = value; }
        }

        [DataMember]
        public string Title
        {
            get { return m_title; }
            set { m_title = value; }
        }
        [DataMember]
        public string Description
        {
            get { return m_description; }
            set { m_description = value; }
        }
        [DataMember]
        public DateTime DateStart
        {
            get { return m_dateStart; }
            set { m_dateStart = value; }
        }
        [DataMember]
        public DateTime DateEnd
        {
            get { return m_dateEnd; }
            set { m_dateEnd = value; }
        }
        [DataMember]
        public string Url
        {
            get { return m_url; }
            set { m_url = value; }
        }
    }
}
LinkItem

相关文章: