WCF通道模型

绑定的本质是一个配置好的通道栈,为了方便程序员专著与业务逻辑,WCF提高了一系列常用绑定。随后会有相应的自定义通道栈代码

无论交互的另一方具体位置在哪里,WCF都会为消息的发送和接收建立一个完整的消息管道,这个消息管道也成为通道栈,通道栈中的每一个通道组建,都会有机会对消息进行处理,而整个通道栈是可编辑并且可插入的,这就确保了WCF的通道模型具有相当大的灵活性,WCF通道模型是完全和上层程序隔离的,任何一个服务/客户端都可以轻松地配置到不同的通道模型上去。

通道模型可以被划分为上下两个部分,上面部分的通道被称为协议通道,而下部分的通道称为传输通道,一个通道栈可以拥有任意个协议通道,但一般只拥有一个传输通道,传输通道负责把消息进行编码并且发送到远端,编码时传输通道需要使用通道栈的编码器。

一般而言,协议通道负责维护消息的非业务逻辑功能,这样的功能包括:事务,日志,可靠消息,安全性等,程序员可自定义协议通道并且插入到通道栈中,在一个通道栈中,必须包含至少一个传输通道和编码器,传输通道负责消息的编码和发送,具体到,传输通道会尝试从BindingContext对象查找编码器,如果没有找到则会使用默认的编码器,在完成消息的编码之后,传输通道负责把消息发送到远端,这里不同传输通道将会使用不同的传输协议,例如HTTP,TCP,IPC等

消息交换模式和通道形状

站在消息传输层面,WCF一共支持6种消息交互模式,分别为:数据报模式,请求-相应模式,双工模式,会话数据报模式,会话响应-请求模式和会话双工模式,一个通道可以支持其中一种或几种交互模式,通道通过通道形状,来实现具体的消息交互模式。

所谓通道的形状,指的是定义了发送,接受消息动作的10个接口,他们均继承在IChannel借口,这10 个接口分别为IInputChannel,IOutputChannel,IRequestChannel,IreplyChannel,IDuplexChanel,IInputSessionChannel,IOutputSessionChannel,IRequestSessionChannel,IReplySessionChannel和IDuplexSessionChannel

  数据报模式:数据报模式指的是发送端负责把消息发送给对方并且受到确认消息后,就完成消息交互的方式,在这种情况下,发送放唯一能确定的就是消息发送成功,而对于消息是否最终到达服务的终结点,是否成功处理,返回结果如何都一无所知,采用数据报模式的客户段通道实现了IOutputChannel接口,而采用数据报模式的服务端则实现IInputChannel接口。

发送端代码:

  static void Main(string[] args)
{
try
{
//建立自定义的通道栈
BindingElement[] bindingElements = new BindingElement[];
bindingElements[] = new TextMessageEncodingBindingElement();//文本编码
bindingElements[] = new OneWayBindingElement();//使得传输通道支持数据报模式
bindingElements[] = new HttpTransportBindingElement();//http传输
CustomBinding binding = new CustomBinding(bindingElements); //创建消息
using (Message message = Message.CreateMessage(binding.MessageVersion, "sendMessage", "Message Body"))
{
//创建ChannelFactory
IChannelFactory<IOutputChannel> factory =
binding.BuildChannelFactory<IOutputChannel>(new BindingParameterCollection());
factory.Open();
//创建OutputChannel
IOutputChannel outputChannel =
factory.CreateChannel(new System.ServiceModel.EndpointAddress("http://localhost:8080/InputService"));
outputChannel.Open();
outputChannel.Send(message);
Console.WriteLine("已经成功发送消息!");
outputChannel.Close();
factory.Close();//关闭工厂
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());//异常输出
}
finally
{
Console.Read();
}
}

接收端(服务端)代码:

   try
{
//建立和发送端相同的通道栈
BindingElement[] bindingElements = new BindingElement[];
bindingElements[] = new TextMessageEncodingBindingElement();//文本编码
bindingElements[] = new OneWayBindingElement();//使得传输通道支持数据报模式
bindingElements[] = new HttpTransportBindingElement();//http传输
CustomBinding binding = new CustomBinding(bindingElements); //创建通道监听器
IChannelListener<IInputChannel> listener =
binding.BuildChannelListener<IInputChannel>(new Uri("http://localhost:8080/InputService"),
new BindingParameterCollection());
listener.Open();
IInputChannel inputChannel = listener.AcceptChannel();
inputChannel.Open();//打开InputChannel
Console.WriteLine("开始接收信息...");
Message message = inputChannel.Receive();//接收信息
Console.WriteLine("接收到一条消息,action为:{0},body为:{1},",
message.Headers.Action, message.GetBody<string>());
message.Close();
inputChannel.Close();//关闭通道
listener.Close();//关闭监听器
Console.Read();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());//异常输出
}
finally
{
Console.Read();
}
}

注意:别忘了引用命名空间 using System.ServiceModel.Channels;并且这是在同一电脑上操作的,至于在局域网或远程接下来会学到,并且分享出来。

WCF学习(二)的更多相关文章

  1. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  2. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  3. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  4. WCF学习之旅—TcpTrace工具(二十六)

    止文(WCF学习之旅—TcpTrace工具(二十五))介绍了关于TcpTrance的一种使用方式,接下来介绍第二种使用方式. 三.通过ListenUri实现基于tcpTracer的消息路由 对于路由的 ...

  5. WCF学习之旅—TcpTrace工具(二十五)

    前面的几篇文章,我们学习了怎么开发WCF应用程序与服务,也学习了如何进行WCF的配置.对于Web Service与WCF服务应用,服务端与客户端的通信是通过收发SOAP Message进行,我们如何有 ...

  6. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  7. WCF学习之旅—实现支持REST服务端应用(二十三)

    在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...

  8. WCF学习之旅—TCP双工模式(二十一)

    WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...

  9. WCF学习之旅—HTTP双工模式(二十)

    WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...

随机推荐

  1. spring singleton实例中的变量怎么保证线程安全

    pring中管理的bean实例默认情况下是单例的[sigleton类型],就还有prototype类型按其作用域来讲有sigleton,prototype,request,session,global ...

  2. Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

    Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅     下面比较一下两者的 ...

  3. 007-函数-C语言笔记

    007-函数-C语言笔记 学习目标 1.[了解]函数的分类 2.[掌握]函数的声明定义和调用 3.[掌握]函数的形参和实参 4.[掌握]带返回值的函数 5.[掌握]全局变量和局部变量 6.[了解]注释 ...

  4. Vue + d3.js实现在地图上选点

    需求:用户在地图上单击选点,页面获取到具体坐标并返回. 首先比较重要的是Vue中的$nextTick,因为vue是异步更新的,如果是想打开Dialog或者是其他操作dom后才加载地图,使用nextTi ...

  5. D3平移和缩放后的点击坐标(D3 click coordinates after pan and zoom)

    我使用D3库来创建绘图应用程序. 我需要在用户单击的坐标上绘制对象(为了简单起见).问题是当用户使用平移&缩放和移动视口.然后对象是错误的位置的地方(我想问题是事件坐标是相对于svg元素而不是 ...

  6. [转载]深度理解Session

    什么是session session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息. 说白了session就是 ...

  7. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...

  8. JS+Selenium+excel追加写入,使用python成功爬取京东任何商品~

    之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...

  9. thinkphp5 --接口实例

    这是我自己构思的案例,写的不好请多多指教. 后台接口的代码: public function index() { $res = array(); header("Access-Control ...

  10. failed to open stream :HTTP request failed 解决方法

    用curl抓取,不要用file_get_contents(); 前者比后者效率高一点