1、SOAP与WS-Addressing。

1)、SOAP:

  Simple Object Access Protocol的简称,符合W3C制定的SOAP规范的消息,现在可以把SOAP看成一个单词,W3C一共制定了SOAP1.1 和SOAP1.2两个版本的规范,这个规范就是用来规范消息结构的。

2)、WS-Addressing:

  WS-Addressing是用来规范消息交换中的寻址机制。W3C一共制定了两个版本,分别是WS-Addressing2004和WS-Addressing 1.0,整个WS-Addressing规范主要包括WS-Addressing Core、WS-Addressing SOAP绑定和WS-Addressing WSDL绑定三个部分,其核心规范为消息交换提供了一种与具体传输无关的抽象寻址机制,而两个绑定则将这种抽象机制和具体的SOAP与WSDL进行绑定。

  WS-Addressing Core定义了两个核心:

  • 终结点引用:消息发送、接收和转发的“终点”,包括:地址,引用参数(对终结点的辅助性描述)和元数据。
  • 消息寻址属性:包括<To>(可选),<From>(可选),<ReplyTo>(可选),<FaultTo>(可选,表示接收错误消息的终结点),<Action>(必须,以URI的形式表示消息的意图)<MessageId>(可选,代表唯一标识),<RelateTo>(可选),<ReferenceParameters>(可选).

2、消息。

1)、消息版本:

  不同版本的消息对组成SOAP消息的元素有不同的要求,版本不同WS-Addressing相关的消息报头也不尽相同。

  消息通过System.ServiceModel.Model.Channel.Message类型表示,通过MessageVersion类型的Version属性获取对应的消息版本:

  public abstract Class Message:IDisposable

  {

    public abstract class MessageVersion Version{get;}

  }

    一般消息是有SOAP和WS-address组成的,当然,消息版本也是由SOAP版本,和WS-Addressing版本组成,对于上面讲过SOAP分为两个版本1.1和1.2,WS-Addressing又分为WS-Addressing2004和WS-Addressing 1.0,这样组合,消息版本就会有很多种,而对于那些非SOAP消息和不支持WS-Addressing的消息,对应的SOAP版本和WS-Addressing版本分别用None表示,具体如下:

  • MessageVersion.Default :EnvelopeVersion为SOAP1.2,WS-Addressing为WSAddressing10表示;
  • MessageVersion.None:EnvelopeVersion为None,WS-Addressing为None表示;
  • MessageVersion.SOAP11:EnvelopeVersion为SOAP11,WS-Addressing为None表示;
  • MessageVersion.SOAP12:EnvelopeVersion为SOAP12,WS-Addressing为None表示;

2)、如何创建消息:

  Message是个抽象类,不能通过new方式创建,但是提供了一系列的CreateMessage静态方法来用于消息的创建。

  Message类中提供的CreateMessage很多重载方法,举一个最简单的例子:

  对于一个数据契约类:Order类,里面包含ID,Date等数据成员,

  Order order=new Order{Id =Guid,NewGuid(),Date=DateTime.Today};

  string action ="http://www.hanshuai.com/IOrder/Sumbit";

  using(Message message = Message.CreateMessage(MessageVersion.Default,action,order))

  {

    WriteMessage(message,"C:/Message.xml");

  }

  这是一种最简单的创建消息的方式,对于一个消息,分为消息头和消息体,而上面的Order数据部分出现在消息体中,对于一个消息的消息体,也可以通过BodyWriter和BodyRead方式把一个消息的消息体读到另一个消息的消息体中,也可以通过这个方式创建错误消息。

3)、消息的基本操作:

  消息的操作分为四种:读取消息、写消息、拷贝消息、关闭消息,下面具体介绍一下。

  

   a、消息状态机:对于消息的每一种操作,都会有一个对应的状态来描述,WCF中通过System.ServiceModel.Channels.MessageState枚举表示消息的状态。

  public enum MessageState

  {

    Created,

    Read,

    Written,

    Copied,

    Closed

  }

  b、消息的读取:

  消息的主体部分,通常是一个对象,所以,经常从消息的主体部分反序列化成一个数据对象,这时候就调用消息的GetBody<T>方法来实现对消息主体部分进行反序列化成一个相应的对象。

  Message message =Message.CreateMessage(MessageVersion.Default,action,order);

  order =message.GetBody<Order>();

  c、消息的写入:

  消息Message类通过一系列的WriteXxx方法用于实现消息的写操作。写操作只能操作状态为Created的消息,消息写入以后,状态变为Writed.

  d、消息的拷贝:

  由于消息的写/读操作只能用于状态为Created的消息,并且消息写/读以后,消息的状态也就改变了,所以,消息就只能使用一次,我们可以通过消息的拷贝,来实现对消息的多次利用,就是在对消息写/读之前,先拷贝一份,以便再次利用。

  消息通过CreateBufferedCopy函数实现对消息的拷贝,

  public MessageBuffer CreateBufferedCopy(int maxBufferSize);//返回的MessageBuffer通过其CreateMessage方法可以创建出对应拷贝的消息。

 

 

 

posted on 2013-08-10 15:30  Kelly_HanShuai  阅读(173)  评论(0)    收藏  举报