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. 内存对齐 align

    /* 地址对齐:指的是存放数据的首地址%N==0,而且整个结构体的大小%M(结构体的有效对齐值)==0 1 数据类型的自身对齐值:char:1 short:2 int,flolat,double:4 ...

  2. matlab计算LZ复杂度

    我这个计算得14通道,每个通道截取3000个数据得复杂度,最后将计算得出得数据存储到本地txt文档中 function LZC(data) % 计算一维信号的复杂度 % data时间序列 % lzc: ...

  3. python干货:5种反扒机制的解决方法

    前言 反爬虫是网站为了维护自己的核心安全而采取的抑制爬虫的手段,反爬虫的手段有很多种,一般情况下除了百度等网站,反扒机制会常常更新以外.为了保持网站运行的高效,网站采取的反扒机制并不是太多,今天分享几 ...

  4. day22作业

    # 1.检索文件夹大小的程序,要求执行方式如下 # python3.8 run.py 文件夹 import os,sys l = sys.argv[1] size = 0 def get_size(f ...

  5. echarts使用笔记

    1.解决列文字隔开问题,及文字太长问题解决. yAxis: [ { type : 'category', data : message.data[0].dataone, axisLabel: { in ...

  6. 【python】显示图片 并随意缩放图片大小 图片归一化

    cv2.namedWindow("image_",0)  cv2.imshow("image_",image)就可以随意缩放显示图片的窗口大小啦. ------ ...

  7. 数据结构(C语言版)---查找

    1.查找表:同一类型的数据元素构成的集合. 2.对查找表进行的操作:查询某特定元素.检索满足条件的元素的属性.插入元素.删除元素. 1)若对查找表进行的操作只涉及前两种,则为静态查找表:需要进行插入和 ...

  8. Java一个简单的贪吃蛇

    Java一个简单的贪吃蛇 虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数 ,函数调用,内部类,继承,接口.有助于半初学者强化理解. 直接上代码 游戏主体类: package ...

  9. Samba远程Shell命令注入执行漏洞

    CVE:CVE-2007-2447 原理: Samba中负责在SAM数据库更新用户口令的代码未经过滤便将用户输入传输给了/bin/sh.如果在调用smb.conf中定义的外部脚本时,通过对/bin/s ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...