WCF编程系列(七)信道及信道工厂
WCF编程系列(七)信道及信道工厂
信道及信道栈
前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的。消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 次进行的:上一层次对消息处理完成后,将消息传递给下一层次,依次类推。这里对应的每个层即为信道(我们可以理解为消息通道)。而这一些列的信道层构成了 一个信道栈。明显的,信道栈中的最后一个信道应该是传输信道,该信道将处理后的消息发送给服务端或接受从服务端返回的消息应答,而在传输信道之上还有一系 列的协议信道,这些信道将对消息进行加工处理。
我们可以把信道看做是绑定的实现,从前面示例可以看出,绑定实际上是一个终结点的配置,这个配置影响到客户端与服务端交互时消息的传输及处理方式(使用何 种协议进行传输、消息的编码方式、消息遵循的安全协议等待)。绑定本身是有一系列的绑定元素组合而成的,每个绑定元素必然会有一个信道层与之对应,最终绑 定元素通过对应的信道层对消息产生影响。
信道工厂
信道堆栈通常是使用工厂模式创建的,在这种模式中,绑定创建信道堆栈。 在客户端,使用绑定生成信道工厂ChannelFactory,然后ChannelFactory生成信道堆栈并返回对堆栈中顶部信道的引用。 之后,应用程序可以使用此信道发送消息。
在服务端,使用绑定生成信道侦听器 IChannelListener,用于侦听传入消息。 IChannelListener 通过创建信道堆栈并将应用程序引用传递给顶部信道,将消息提供给侦听应用程序。 之后,应用程序使用此信道接收传入消息。(注意:关于服务端使用的信道侦听器将在后面介绍,本文只讲述客户端使用的信道工厂)
OK,总结一下:
1.绑定有一些列的绑定元素组成,每个绑定元素对应一个信道
2.信道负责对消息的加工处理
3.信道按绑定元素在绑定中的堆叠顺序组成信道栈
4.信道由信道工厂生成,而信道工厂由绑定来创建(绑定调用每个绑定元素的信道工厂创建信道,并返回信道栈中的首个信道)
ChannelFactory<T>泛型类
信道工厂类是一个泛型类,用以创建信道。参数类型T通常是我们的服务契约接口(IFirstService),这样既可实现信道与服务契约的关联。
信道工厂有7个公共的构造函数,构造函数的参数最终是为了构建一个服务终结点(ServiceEndPoint),如果使用无参数的构造函数,则实例化后可以通过EndPoint属性来设置终结点的属性。关于具体函数声明,请参见MSDN。
信道工厂另一个重要的方法是创建信道:CreateChannel,此方法返回一个T类型实例,即服务契约接口的实例。所以通过这个实例,在客户端我们可以像操作本地对象一样,直接调用服务方法。
在示例一中,我们是使用的svcutil生成的客户端代码,在生成的代码文件中,定义了一个服务契约接口IFirstService,当然这个接口是必须 的。而另一个类为FirstServiceClient,它继承与ClientBase<IFirstService>及 IFirstService,在此类中封装了对信道工厂的操作,我们通常把此类称作客户端代理类,注意类中IFirstService接口方法的实现代 码:
public string GetData(string name)
{
return base.Channel.GetData(name);
}
直接调用了基类(ClientBase<IFirstService>中Channel的GetData方法,Channel属性实际上就是 通过ChannelFactory<IFirstService>信道工厂的CreateChannel方法返回的一个 IFirstService实例。所有,FirstServiceClient类只是为了封装信道工厂的基本操作,svcutil通过生成此类,是我们在 客户端应用程序中无需直接操作信道工厂,而直接调用服务,回忆我们客户端Program.cs中的调用代码:
FirstServiceClient client = new FirstServiceClient("BasicHttpBinding_IFirstService");
Console.WriteLine("使用BASIC HTTP绑定:" + client.GetData(key));
关于ClientBase<IFirstService>类是WCF为客户端提供的一个基类,其中实现了对信道工厂的操作。不过此类只能用作 基类并且不可实例化,所以客户端代理类通过继承ClientBase<IFirstService>的方式,实现了对信道的基本操作。了解客 户端代理类,服务契约接口及ClientBase类的关系后,我们完全可以自己实现客户端代理类:从ClientBase派生,并通过 ClientBase中的Channel对应的服务契约方法来实现客户端代理类的服务契约接口(GetData方法的实现)。
当然,通过客户端代理类方法是一种标准的客户端实现方式,但是我们也可以通过直接操作信道工厂来实现客户端调用代码,其实很简单:
ChannelFactory<IFirstService> cf = new ChannelFactory<IFirstService>(new BasicHttpBinding(), "http://localhost:8000/");
IFirstService s = cf.CreateChannel();
Console.WriteLine(s.GetData(key));
WCF编程系列(七)信道及信道工厂的更多相关文章
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- WCF编程系列(四)配置文件
WCF编程系列(四)配置文件 .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- WCF编程系列(二)了解WCF
WCF编程系列(二)了解WCF 面向服务 服务是复用进化的结果,起初的复用是函数,面向对象编程的出现使复用从函数上升到对象,随后面向组件编程又将复用从对象上升到组件,现在面向服务编程将复用 ...
- WCF编程系列(三)地址与绑定
WCF编程系列(三)地址与绑定 地址 地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...
- WCF编程系列(一)初识WCF
WCF编程系列(一)初识WCF Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念: 地址:定义服务的 ...
- 学习ASP.NET Core Razor 编程系列七——修改列表页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- java并发编程系列七:volatile和sinchronized底层实现原理
一.线程安全 1. 怎样让多线程下的类安全起来 无状态.加锁.让类不可变.栈封闭.安全的发布对象 2. 死锁 2.1 死锁概念及解决死锁的原则 一定发生在多个线程争夺多个资源里的情况下,发生的原因是 ...
- MapReduce 编程 系列七 MapReduce程序日志查看
首先,假设须要打印日志,不须要用log4j这些东西,直接用System.out.println就可以,这些输出到stdout的日志信息能够在jobtracker网站终于找到. 其次,假设在main函数 ...
随机推荐
- 最简单的计算MD5方法
原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...
- 第十一章、认识与学习 BASH 数据流重导向
数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据 ...
- 多个分布式系统如何共享使用一个固定公网IP
传统的做法,一个分布式业务系统就有一个中间件,一个中间件需要使用至少一个固定公网IP,这样的话,多个业务系统就需要使用多个固定公网IP. 大家知道,固定公网IP价格可是不菲的.能不能让多个分布式业务系 ...
- MFRCC522 SPI无法通讯【worldsing笔记】
用单片机于MRFC522与单片接时,加上485通讯后出现很诡异的像: 只要485芯片上有收到外部发送的信号时RC522就死掉,经过仿真卡在了SPI的收发部分(等待回复) u8 MFRC522Write ...
- 如何使用IAR仿真环境查看CPU类型字长?
在此操作之前假设已有一个现成的cpu代码工程如:IAR for Stm8的Demo工程. 点软件仿真进入调试状态 单击菜单栏View –> Watch –> Watch 在新弹出来的Wat ...
- 4.22 注入js需要加 addjavascriptinterface
由于项目需要,再次使用到了android的webview,webview要加载的页面是html5的页面: 需要有点击webview中的控件的交互,所以需要在android应用中注入一个js对象: 通过 ...
- 搭架私有Git服务器Gogs
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:搭架私有Git服务器Gogs.
- SQLite 使用教程2 语法
http://www.runoob.com/sqlite/sqlite-syntax.html SQLite 语法 SQLite 是遵循一套独特的称为语法的规则和准则.本教程列出了所有基本的 SQLi ...
- 日志文件C++ 时间 文件 行数
#include <stdio.h> #include<windows.h> #include <time.h> #define Line __LINE__ #de ...
- 一个Solr搜索实例,增删改查+高亮+分页
今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...