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. awk线程号

    for i in `ps|grep [a]out|awk '{print $1}'` do kill -9 "$i" done

  2. 你知道如何自动保存 Spring Boot 应用进程号吗

    1. 前言 欢迎阅读 Spring Boot 2 实战 系列文章. PID 对于系统运维来说并不陌生,但是对于一些开发者特别是新手还是要简单介绍一下的.它是 Process ID 的简称,是系统分配给 ...

  3. js拼接onclick方法字符串参数解决方法

    onclick = contentmap("'+useridarr[i]+'")

  4. PHP函数:get_class()

    get_class()  -返回对象的类名 说明: get_class ([ object $object = NULL ] ) : string 参数: object:要测试的对象.如果在类里,此参 ...

  5. golang依赖管理

    目录 使用GOPATH管理依赖 临时GOPATH 依赖查找路径 使用GOVENDER管理依赖 使用GO111MODULE管理依赖 Usage 常用命令列表 不常用命令 使用示例 开启GO111MODU ...

  6. Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

    分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...

  7. 解析一下阿里出品的泰山版 Java 开发手册

    说起华山,我就想起岳不群,不,令狐冲:说起泰山,我就想起司马迁,他的那句名言"人总有一死,或重于泰山,或轻于鸿毛",真的发人深省啊.这就意味着,阿里出品的泰山版 Java 开发手册 ...

  8. 《HelloGitHub》第 49 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  9. 15分钟从零开始搭建支持10w+用户的生产环境(三)

    上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二)   三.WebServer 在SOA和gRPC大行其 ...

  10. 【集群实战】fatab开机挂载失败案例

    1. nfs挂载加入fstab案例 NFS客户端实现fstab开机自启动挂载 现象:nfs开机挂载卸载了/etc/fstab中,结果无法开机自动挂载nfs 解答:1. nfs客户端命令放在/etc/r ...