WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现

长平狐 发布于 2012/09/04 11:22
阅读 133
收藏 0

WCF采用消息作为通信的唯一手段,它支持不同的消息交换模式(MEP:Message Exchange Pattern),比较典型的有以下三种MEP:One-Way、Request/Reply和Duplex。消息会被WCF的信道层发送到传输层,并通过相应的传输协议发送到目的地。对于TCP协议来说,其本身就能提供一个双工通道,所以能够对以上三种MEP原生的支持。而HTTP协议,大家都知道它天生就基于Request/Reply模式的,那么它是如何能够突破自己的局限,为One-Way和Duplex消息交换模式提供支持呢?

一、HTTP如何实现One-Way消息交换模式?

image One-Way模式是最简单的消息交换模式,又称为发送/遗忘(Send/Forget)或者数据报模式(Datagram)。One-Way模式基于从一个源到一个或者多个目的地的单向消息传输。如右图所示,在One-Way模式下,消息的发送方将消息发送到接收方,并不希望收到对象的回复。数据报模式具有一些变型,比较典型的包括以下一些消息交换的方式: 单目的地模式(一个消息的发送方将消息发送给单一的接收方)、多投模式(一个消息发送方将消息发送给一系列预定义的接收方)和广播模式(和多投模式相似,只是接收方的范围更加宽泛)。One-Way模式一般采用异步的消息发送方式,并不希望接收到对方的回复消息,在个别情况下甚至不关心消息能否正常地被接收。

image

但是,关于HTTP有一点必须有一个清醒的认识,那就是HTTP只能采用Request/Reply模式进行工作,这是由其协议本身的实现决定的。那么,当我们采用基于HTTP的绑定(BasicHttpBinding、WSHttpBinding和WS2007HttpBinding等)调用One-Way服务操作的时候,传输层(HTTP Transport)是如何工作的呢?实际上很简单:客户端照常向服务端发送基于SOAP的HTTP Request,服务端在接收到清之后,会返回一个状态为202(表示成功请求成功接受)的空HTTP Response。整个请求回复过程如左图所示。

实际上我们可以利用一些消息拦截工具,截获客户端和服务端往来的消息来分析它们之间真正采用的消息交换方式,在这里我们采用的是Fiddler这么一个广受大家喜爱的HTTP Debug Proxy。现在,我们需要通过Fiddler探测进行基于One-way服务操作调用采用的消息交换方式,假设服务契约定义如下:

using System.ServiceModel;
namespace Artech.MessageInspection.Sender
{
    [ServiceContract(Namespace="http://www.artech.com/")]
    interface ICalculator
    {
        [OperationContract(IsOneWay = true)]
        void Add(double x, double y);
    }
}

服务实现、服务寄宿和服务调用的相关代码我们就省了。现在,客户端通过创建的服务代理,简单地调用Add(1,2)这么一个简单的服务操作。下图反映了Fiddler对该过程进行拦截得到的截图,可以看到整个过程还是经典的Request/Reply方法,而回复的是一个空的HttpResponse。下面是整个HttpResponse的内容:

HTTP/1.1 202 Accepted
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 20 Apr 2010 14:31:36 GMT

image

二、 HTTP如何实现Duplex消息交换模式?

image 如果采用Duplex的消息交换模式,在进行消息交换过程中,任何一方都可以向对方发送消息,如右图所示。双工通信使服务端回调客户端操作成为可能。比较典型Duplex通信是我们熟悉的订阅/发布模式。订阅/发布模式下的消息交换双方的角色从传统的发送方和接收方变成了订阅方和发布方。订阅方向发布方发送订阅消息定于某一主题进行订阅,发布方接收到订阅消息后将订阅方添加到订阅列表之中。主题发布的时候,发布方提取当前主题的所有订阅方,对它们进行消息广播。

image消息的交换依赖于网络传递,不同的网络传输协议对双工通信具有不同的支持方式。对于TCP协议来说,其协议本身就是全双工的网络通信协议,所以能够提供双工通信原生的支持。但是对于HTTP来说,它本身就是简单的基于请求/回复的网络协议,是不支持双工通信的。WCF通过WsDualHttpBinding实现了基于HTTP协议的双工通信,实际上是采用了两个HTTP通道实现的。 Duplex消息交换模式实际上是由两个简单模式(One-Way或者Request/Reply)组合而成的。WCF通过双工通信实现了服务端对客户端的回调。假设客户端采用One-way的方式调用服务,而服务端同样以One-Way的方式对客户端进行回调。在这个过程中,正常的服务调用和回调实现上是在不同的HTTP通道中进行的。从消息交换的角度讲,客户端调用服务端和服务端对客户端进行回调,本质上是一样的。所以,从HTTP传输层看,真正的消息交换方式如左图所示。如果同样采用Fiddler这样的工具,你会看到对于服务的正常调用是一个HttpRequest/HttpREsponse(Status:202),回调也对应着一个HttpRequest/HttpREsponse(Status:202),只是两者的方向相反而已。

作者: Artech
出处: http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接:http://www.cnblogs.com/artech/archive/2010/04/21/1717474.html
加载中
返回顶部
顶部