WCF专题系列(1):深入WCF寻址Part 1—Web服务寻址规范
消息信息报头
消息信息报头(Message Information Headers)是Web 服务寻址规范定义了一些附加的也是标准的SOAP头,它们用于帮助传送关于消息的信息,它与终结点引用不同,消息信息报头将作为SOAP Head的扩展包含在SOAP消息中,它的信息集如下所示:
<wsa:To>xs:anyURI</wsa:To> ? <wsa:From>wsa:EndpointReferenceType</wsa:From> ? <wsa:ReplyTo>wsa:EndpointReferenceType</wsa:ReplyTo> ? <wsa:FaultTo>wsa:EndpointReferenceType</wsa:FaultTo> ? <wsa:Action>xs:anyURI</wsa:Action> <wsa:MessageID>xs:anyURI</wsa:MessageID> ? <wsa:RelatesTo RelationshipType="xs:anyURI"?>xs:anyURI</wsa:RelatesTo> * <wsa:ReferenceParameters>xs:any*</wsa:ReferenceParameters> ?
下面我们对其做一些解释:
To:表示目标 Web 服务的 URL,当使用端点引用(EPR)时,To 头应该与 <wsa:Address> 元素具有相同的值。
From:表示消息发送方的终结点引用,如果消息接收方需要向发送消息的终结点发送回消息,那么它应该使用这个终结点引用。
ReplyTo:表示来自于Web服务的任何响应都应该被发送给ReplyTo终结点引用,即消息的发送方并不一定是要接收响应消息的终结点,这和From是有区别的。
FaultTo:如果消息的响应是SOAP错误,那么这个错误应该在 FaultTo头中发送给终结点引用。
MessageID:用来唯一的识别消息。
Action:对于Action可以这么理解,当消息发送的服务时,指定如何处理该消息,更简单一点,就是希望服务调用哪个方法来处理消息。如下代码所示,希望消息到达服务时,调用Add方法来处理。
<wsa:Action>http://tempuri.org/ICalculator/Add</wsa:Action>
RelatesTo:RelatesTo常用在响应消息中,用来指示它与先前知道的消息相关并且定义这种关系的URI。这在请求响应模式中非常关键,尤其是异步消息传递中,响应消息的接收方必须能够将它与原始请求消息相关联。
我们把消息信息报头Message Information Headers与SOAP用图3来清晰的表示:
图3
有关WS-Addressing规范的详细信息大家可以参考http://www.w3.org/Submission/ws-addressing/。
分析WCF消息
上面我介绍了Web服务寻址规范,现在我们截获一下WCF的消息,来看看它是如何符合WS-Addressing的。现在编写一个简单的WCF服务:
/// <summary> /// Author: TerryLee /// Url:http://www.cnblogs.com/terrylee /// </summary> [ServiceContract] public interface ICalculator { [OperationContract] int Add(int x, int y); } public class CalculatorService : ICalculator { public int Add(int x, int y) { return x + y; } }
我们可以用跟踪诊断的方式来截获到SOAP消息,如下所示,可以看到这个调用服务过程中,消息报头中的To地址以及Action,这里的Action就是我们在服务中定义的Add方法,以及消息的Body:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <To s:mustUnderstand="1">http://localhost:8887/CalculatorService</To> <Action s:mustUnderstand="1">http://tempuri.org/ICalculator/Add</Action> </s:Header> <s:Body> <Add xmlns="http://tempuri.org/"> <x>1</x> <y>2</y> </Add> </s:Body> </s:Envelope>
结束语
Web服务寻址规范带来了Web服务世界的寻址标准,它通过定义终结点引用(Endpoint Reference)和消息信息报头(Message Information Headers)来提供了一种统一的机制。在下一篇中,我将继续深入分析WCF中的寻址。