《WCF按部就班学习系列5

    技术2025-09-02  17

    《WCF按部就班学习系列5_WCF操作概述》,本文的主要结构为:1)WCF操作的概述2)WCF请求-应答操作,单向操作,回调操作三种方式概述3)实现代码分析及运行结果4)源码下载5)下一篇计划6)参考说明

    (1)WCF操作的概述(what)1.1WCF支持这种经典的调用模式,同时还提供了对其他操作类型的内建支持,包括:对即发即弃( Fire-and-Forget)操作的单向调用;允许服务将调用返回给客户端的双向回调.允许客户端或服务处理大量负荷的流操作。总体而言,它所使用的操作类型属于服务契约的一部分,同时也是服务设计的内在组成部分。1.2总体而言,它所使用的操作类型属于服务契约的一部分,同时也是服务设计的内在组成部分。操作类型甚至包含了对绑定的某些约束。因此,在设计客户端与服务时,必须从一开始就要考虑操作类型,因为我们很难在设计之后改变操作的类型.

    (2)WCF请求-应答操作,单向操作,回调操作三种方式概述2.1请求-应答操作1.契约中的操作均为请求一应答( Request-Reply)类型。2.客户端以消息形式发出请求,它会阻塞客户端直到收到应答消息。应答的默认超时值为1min.如果超过这一时间服务仍然没有应答.客户端就会获得一个TimeoutException异常。请求一应答是默认的操作模式。针对请求一应答操作的编程非常简单,它与经典的客户端,服务器编程模型相似。返回的应答消息包含了返回的结果,或者它会将返回值转换为一般方法的返回值。3.这与经典的C/S编程类似,客户端发送请求,阻塞客户端进程,服务端返回操作结果。4.除了NetPeerTcpBinding和NetMsmqBinding绑定,所有的绑定均支持请求-应答操作。

    2.2单向操作1.是操作没有返回值,客户端也不会关心调用成功与否。为支持这种即发即弃的调用方式,WCF提供了单向操作。2.单向操作不同于异步操作,虽然单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入队列,并在某个时候执行。3.队列存储调用的个数是有限的,一旦发出的调用个数超出了队列存储调用的设置值,则会发生阻塞现象,因为调用无法放入队列。当队列的请求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞。4.所有的WCF绑定通信协议都支持单向操作。5.由于单向操作没有应答消息,因此它不能包含返回值和返回结果。

    2.3回调操作1.回调不是一个新的概念,早在C语言里就有过,C#里更是有委托实现回调机制。2.回调操作适用于各种场景与应用程序,尤其适用于事件,在服务端触发事件时使用回调操作通知客户端。3.软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。4.回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。5.BasicHttpBinding,WSHttpBinding绑定协议不支持回调操作。NetTcpBinding和NetNamedPipeBinding绑定支持回调操作;具有可靠消息传输的WSDualHttpBinding绑定是通过设置两个HTTP信道来支持双向通信。 6.回调机制见图5-1回调机制图

    (3)实现代码分析及运行结果3.1WCFService(单向操作分析源码,回调操作见源码)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Threading; namespace WCFService { //单向服务契约,单例服务 [ServiceContract] public interface IMyContract { //单向操作,不返回应答消息。 [OperationContract(IsOneWay = true)] void MyMethod1(string name); //操作契约 [OperationContract] string MyMethod2(string name); } [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] //实现接口定义的方法 public class MyServiceOneWay :IMyContract,IDisposable { int m_Counter = 0; public void MyMethod1(string name) { m_Counter++; Console.WriteLine("Hello!{0},OneWay", name); Console.WriteLine("Counter=" + m_Counter, "MyService.MyMethod()"); } public string MyMethod2(string name) { Console.WriteLine("Hello!{0},OneWay", name); return "Hello" + name; } public void Dispose() { Console.WriteLine("Thread ID=" + Thread.CurrentThread.ManagedThreadId, "MyService.MyMethod"); } } }

    3.2WCFHost(宿主源码分析)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WCFHost { public class Program { static void Main(string[] args) { //1.单向服务 ServiceHost host1 = new ServiceHost(typeof(WCFService.MyServiceOneWay), new Uri("http://localhost:8001/")); if (host1.State != CommunicationState.Opened) { host1.Open(); } Console.WriteLine("OnyWayhost is running! the state is {0}", host1.State); //2.回调服务 ServiceHost host2 = new ServiceHost(typeof(WCFService.WCFService),new Uri("http://localhost:8004/")); if (host2.State != CommunicationState.Opened) { host2.Open(); } Console.WriteLine("CallBackhost is running! this state is {0}", host2.State); Console.ReadKey(); //host1.Close(); } }

    运行结果见图5-2启动服务器

    3.3WCFClient(客户端源码分析)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Runtime.Serialization; namespace WCFClient { public class Program { static void Main(string[] args) { //1.单向服务,OneWay Console.WriteLine("单向测试"); MyContractClient proxy = new MyContractClient(); proxy.MyMethod1("liuyong"); proxy.MyMethod2("ceshi"); //2.回调服务器,CallBack Console.WriteLine(); Console.WriteLine("回调测试"); Console.WriteLine("Call Back Operation Test..."); WCFClient.ServiceReferenceCallBack.IWCFServiceCallback callBack = new WCFClient.ServiceReferenceCallBack.WCFServiceCallback(); InstanceContext context = new InstanceContext(callBack); WCFClient.ServiceReferenceCallBack.WCFServiceClient WCFServiceCallBackClientProxy = new WCFClient.ServiceReferenceCallBack.WCFServiceClient(context, "NetTcpBinding_IWCFService"); //通过代理调用调用SayHelloToUser,传递对象 Console.WriteLine(WCFServiceCallBackClientProxy.SayHelloToUser("slj")); //For Debug Console.WriteLine("press any key!"); Console.ReadKey(); } } }

    运行结果见图5-3启动客户端

    (4)源码下载http://download.csdn.net/source/3022362

    (5)下一篇计划下一篇主要介绍WCF中错误处理的相关知识。(6)参考说明1.《Programming WCF Services》2.http://www.cnblogs.com/frank_xl/archive/2009/05/05/1437494.html

     

    最新回复(0)