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方法可以创建出对应拷贝的消息。
浙公网安备 33010602011771号