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

简介:

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),只是两者的方向相反而已。


作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
14天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
37 1
|
1月前
|
网络协议 Linux
HTTP协议基本原理简介(二)
HTTP协议基本原理简介(二)
22 1
|
2月前
|
安全 前端开发 网络协议
|
1月前
|
缓存 前端开发
HTTP协议基本原理简介(三)
HTTP协议基本原理简介(三)
14 1
|
2月前
|
缓存 移动开发 JSON
【网络安全 | 网络协议应用层】结合Wireshark讲解HTTP协议
【网络安全 | 网络协议应用层】结合Wireshark讲解HTTP协议
105 0
|
2天前
|
缓存 安全 网络协议
Http协议是什么
【4月更文挑战第12天】HTTP是用于从WWW服务器传输超文本到浏览器的协议,基于TCP/IP,特点包括无连接、无状态、面向对象、无阻塞和可缓存。它的工作原理是客户端发送请求,服务器处理后返回响应。自1989年创建以来,HTTP已发展支持多媒体内容传输,并通过HTTPS提供安全保护。学习更多可参考计算机网络技术文献。
14 6
|
4天前
|
存储 JSON 前端开发
网络原理(4)HTTP协议(下)
网络原理(4)HTTP协议
18 0
|
14天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
32 1
|
21天前
|
运维 监控 算法
slb监听协议http
SLB的HTTP监听器用于处理HTTP请求,配置时选择协议类型为HTTP和前端端口(如80)。SLB根据负载算法将请求转发至健康后端服务器,并支持会话保持。通过`X-Forwarded-For`和`X-Forwarded-Proto`头处理请求信息。由于不涉及SSL/TLS,数据传输不安全,推荐升级至HTTPS以加密通信。SLB提供性能监控和故障排查工具,帮助运维管理。
19 5
|
24天前
|
程序员
深入理解HTTP协议本质与应用
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。简单来说,如果你不懂HTTP协议,那就相当于是个只有“半桶水”的程序员。在这个课程中,带你一起花最少的时间,用最少的精力,掌握最多、最全面、最系统的HTTP相关知识
13 3
深入理解HTTP协议本质与应用