当前位置:编程学习 > 网站相关 >>

WCF后续之旅(1): WCF是如何通过Binding进行通信的

html" target=_blank>《我的WCF之旅》系列自开篇以来,得到了园子里很多朋友的厚爱,并荣登了博客园2007年度系列博文Top 10。由于工作原因,沉寂了几个月,今天开始WCF新的旅程。如果说《我的WCF之旅》主要是对WCF基本原理概括性介绍,而对于这个新的系列,我将和大家分享我对WCF的一些实现机制、设计原理的理解,以及我在实际的项目开发中的一些实践经验(比如在后续的一些文章中,我将介绍通过WCF Extension实现一些在真正的分布式项目开发中很有现实意义的功能)。

Windows Communication Foundation,顾名思义,就是一个在Windows平台下进行如何进行Communication的基础构造(Infrastructure)。由于WCF的核心还是Communication,这个新的系列就先来讨论WCF如何进行Communication的。通过本篇文章,你将对WCF的通信机制有一个总体的认识,了解到一些和通信相关的概念, 比如:Communication、Channel、Channel Listener、Channel Factory、BindingElement、Channel  Shape等等。

我们已经很清楚了,WCF的通信是通过Endpoint来完成的:Service Provider将WCF service通过Endpoint暴露出来供Service consumer调用,而Service consumer通过与之相匹配的Endpoint来调用service。"Endpoint=ABC”,大家一定也牢记于心。就Endpoint包含的这3个元素而言,Address解决了寻址的问题,代表如何定位和标识对应的Endpoint,而Contract在对Service提供的功能、操作(Service Contract)以及数据(Data contract、Message contract和Fault contract)的抽象表示。而真正实现了通信功能的则是Binding。

一、Binding实现了所有的通信细节

总体上讲, WCF主要有两个层次构成:Channel Layer和Service Layer. 前者通过Channel Stack实现Message的传输,而后者对开发人员提供了一个Programming Mode。对于一般的WCF开发人员,不会接触到Channel Layer,而只会调用Service Layer提供的API而以。

但是,如果你需要真正地认识WCF 整个通信框架,对Channel Layer的了解绝对是有必要的。在我看来,WCF最吸引我的地方不是它自己为我们提供了完备的通信相关的实现,而在于WCF是一个极具可扩展性的通信框架,无论是Channel Layer还是Service Layer,我们都可以通过WCF Extension对WCF进行自由的扩展以适应我们的具体需求, 在本系列后续的文章中我将向大家介绍一系列有用的扩展。如何你想充分利用WCF提供给我们的扩展性,对Channel Layer的了解基本上是必须的。

严格地讲,Binding是Service Layer层面上的概念,不过它是由Service Layer转入Channel的入口,也是从Channel Layer到Service Layer的中介。我们说Binding实现了所有通信细节,是站在Service Layer角度来讲的。至于Binding如何实现通信细节,则是通过Channel Layer来实现的。

为了让大家对Binding如何实现通过现有一个感性的认识,我们来看一个简单的例子。

三、 Demo: 直接通过Binding进行通信

这个例子通过简简单单的几行代码,通过BasicHttpBinding实现了通信的全过程。该程序很想我们传统的基于Socket的程序:Server端Listen request=>Accept request=>Process request=>Send reply;Client端Send request=>Receive reply。此外通过这个这个简单的程序,将引出Channel Layer一系列重要的对象,比如Channel、RequestChannel、ReplyChannel、Channel Listener和Channel Factory等等。整个应用有两个Console application构成,分别模拟Server和Client.

wcf2_01_01

我们先来看看Server端的代码: 

 

   1: namespace Artech.MessagingViaBinding.Server
   2: {
   3:     class Program
   4:     {
   5:         static void Main(string[] args)
   6:         {
   7:             Uri address = new Uri("http://127.0.0.1:9999/messagingviabinding");
   8:             BasicHttpBinding binding = new BasicHttpBinding();
   9:             IChannelListener<IReplyChannel> channelListener = binding.BuildChannelListener<IReplyChannel>(address);
  10:             channelListener.Open();
  11:             IReplyChannel channel = channelListener.AcceptChannel();
  12:             channel.Open();
  13:             Console.WriteLine("Begin to listen  ");
  14:             while (true)
  15:             {
  16:                 RequestContext context = channel.ReceiveRequest(new TimeSpan(1, 0, 0));
  17:                 Console.WriteLine("Receive a request message: {0}", context.RequestMessage);
  18:                 Message replyMessage = Message.CreateMessage(MessageVersion.Soap11, "http://artech.messagingviabinding", "This is a mannualy created reply message for the purpose of testing");
  19:                 context.Reply(replyMessage);
  20:             }
  21:         }
  22:     }
  23: }

 

我来简单介绍一些上面这段代码的逻辑:

  • 创建Uri对象,代表监听的URI:

   1: EndpointAddress address = new EndpointAddress(http://127.0.0.1:9999/messagingviabinding);

创建BasicHttpBinding对象,我们正是通过它来使用所有的通信功能:    1: BasicHttpBinding binding = new BasicHttpBinding();

通过binding对象创建IChannelListener对象,并调用Open方法打开它:    1: IChannelListener<IReplyChannel> channelListener = binding.BuildChannelListener<IReplyChannel>(address);
   2: channelListener.Open();

通过IChannelListener对象创建IReplyChannel 并调用Open方法打开它:
   1: IReplyChannel channel = channelListener.AcceptChannel();
   2: channel.Open();

在While循环中监听来自client端的request,一旦request抵达, 调用IReplyChannel 的ReceiveRequest方法,并得到一个RequestContext 对象,通过RequestContext 对象可以得到request message并打印出来:    1: RequestContext context=channel.ReceiveRequest(new   TimeSpan(1,0,0));
   2: Console.WriteLine("Receive a request message: {0}", context.RequestM

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,