WCF开发指南之客户端开发

每一个客户端通道都要做消息的预调用处理。这个链的正确结构和组成在很大程度上依赖于绑定。例如,其中一个通道负责编码该消息(二进制,文本或MTOM),一个通道负责传递安全调用上下文,一个通道负责传播客户端事务,一个通道负责管理可靠的会话,一个通道负责加密消息正文(如果这样配置的话),等等。客户端的最后一个通道是传输通道,它负责把消息由经配置的传输传送到宿主。

在宿主端,该消息也经过一个通道链,从而实现宿主端消息的预调用处理。在宿主端的第一个通道是传输通道,它接收来自传输的消息。随后的通道执行各种任务,例如解密消息正文、译解消息、把传播的事务设置到执行线程、设置安全主管、管理会话和激活服务实例。最后一个通道在宿主端把该消息传递到调度器。由调度器把该消息值的转换成一个堆栈帧并且调用服务实例。图8描述了这一顺序。

WCF开发指南之客户端开发(图三)
图8:WCF架构看上去的样子

在客户端和服务端的拦截都要确保客户端和服务得到它们所要求的运行时刻环境以便正确运行。由服务实例执行该调用并且把控制返回到调度器,由它把返回值和错误信息(如果有的话)转换成一条返回消息。现在,整个过程被颠倒:调度器通过宿主端通道传送消息以执行调用后处理,例如管理事务、撤销实例、编码应答信息、加密它,等等。返回的消息转到传输通道,在此把消息发送到客户端通道以便客户端调用后处理:解密,编码,提交或取消事务,等等。

由代理把返回的消息转换成一个堆栈帧并且把控制返回到客户端。最值得注意的是,在这个架构中的几乎所有的点都提供了可扩展性钩子-你可以为专利性行为提供定制通道,定制实例管理或定制安全。事实上,WCF提供的这些标准工具都是使用相同的可扩展性模型实现的。

六、使用通道

你可以直接使用通道来调用服务上的操作而甚至不必依赖于一个SvcUtil生成的代理。显示于列表10(见本文相应下载源码)中的ChannelFactory<T>类能够使你任意地创建一个代理。你需要提供给它的构造器端点信息-或者是来自配置文件的端点名,或者是绑定和地址对象,或者是一个端点对象。然后,使用CreateChannel()方法以获得一个到代理的参考(顶级通道)并且使用它的方法。最后,关闭该代理或者通过把它强制转换为一个IDisposable接口并且调用其Dispose()方法或强制转换为一个IClientChannel接口并且调用其Close()方法:

ChannelFactory<IMyContract> factory;
//使用默认的站点
factory = new ChannelFactory<IMyContract>("");
IMyContract proxy1 = factory.CreateChannel();
using(proxy1 as IDisposable)
{
proxy1.MyMethod();
}
IMyContract proxy2 = factory.CreateChannel();
proxy2.MyMethod();
IClientChannel clientChannel = proxy2 as IClientChannel;
Debug.Assert(clientChannel != null);
clientChannel.Close();

七、总结

WCF是一种用于构建Windows面向服务的应用程序的SDK。它能够让你使用杰出的CLR编程结构(例如类和接口)来发布和消费服务。这种编程模型是声明性的并且大部分是属性驱动的。WCF基于拦截的架构提供了内置的工具用于管理服务的许多运行时刻方面;并且,从其应用前景来看,它也是构建Windows分布式应用程序的最具生产效率的方式。

原文地址:https://www.cnblogs.com/lzjsky/p/2009399.html