WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到。

WCF双工支持两种bind,一是nettcp、另一个是wsDualHttp,这里只说netTcp的双工。

和普通的WCF通信一样,

首先创建契约,

1、回调函数契约

    [ServiceContract]
    public interface ICallback
    {
        [OperationContract(IsOneWay = true)]
        void DisplayResult(double result);
    }

注意:这里的IsOneWay必须是true,否则会报死锁的错误。IsOneWay 属性可以指示操作不返回答复消息,下面写到服务实现的时候会说到为何会出现死锁错误。

2、服务契约

    [ServiceContract(CallbackContract=typeof(ICallback))]
    public interface ICalculator
    {
        [OperationContract(IsOneWay = false)]
        double Add(double x, double y);
    }

注意:[ServiceContract(CallbackContract=typeof(ICallback))] 这里表示要调用的回调函数是哪个契约

契约完成后,回调客户端的实现和服务的实现

1、回调函数客户端

    public class CalculatorCallback : ICallback
    {
        public void DisplayResult(double result)
        {
            result = result + ;
        }
    }

2、服务

  public class WCalculatorService : ICalculator
    {
        public double Add(double x, double y)
        {
            double result = x + y;
            ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            callback.DisplayResult(result); //这里调用回调函数
            return result;
        }
    }

服务很简单,计算两个数相加,然后调用回调函数。回调函数是写在客户端Client上的,这里就是一个服务端调用客户端方法,这也就是双工。

大家看看这里result返回的是什么值?x+y还是x+y+1?

这里返回的是x+y,如之前说的,双工有点像委托,委托之后他就往下执行,并不管你在委托的方法中做了什么东西。

这里引用别人的博客来解释为什么会出现死锁,如果 IsOneWay 属性设置为 false(默认值),即使返回 void 的方法也会生成答复消息。在此种情况下,基础结构将创建并发送一条空消息,以向调用方指示该方法已返回内容。(使用此方法使基础结构可以将 SOAP 错误发送回客户端。)将 IsOneWay 设置为 true 是取消创建和调度响应消息的唯一方法。

究其本质,这是一个死锁导致的异常,由于默认的情况是服务的执行按Single并发模式进行,也就是说在服务执行全程,服务对象只能被一个线程访问。WCF通过加锁机制保证服务对象的独占性使用,也就是说在服务执行开始会对服务对象加锁,该锁在服务操作结束之后释放。

服务采用请求-回复模式的回调,服务端会一直等待回调操作的返回。而另一方面,当回调操作在客户端正常执行后,回到服务端试图访问服务操作的时候,发 现对象被服务操作执行的线程锁住,所以它会等待服务操作的执行完成后将锁释放。这样,服务操作需要等待回调操作进行正常返回以便执行后续操作,而回调操作 只有等待服务操作执行完毕将锁释放才能得以返回,从而形成了死锁。

这个本人不太理解服务按Single并发模式进行,留着后面再看。接着说双工,

这里我们已经有契约、回调函数、服务,只剩客户端和页面的调用了

1、客户端

    public class Calculator : DuplexClientBase<ICalculator>, ICalculator
    {
        public Calculator(InstanceContext callbackInstance) : base(callbackInstance) { }

        public double Add(double x, double y)
        {
            return this.Channel.Add(x, y);
        }
    }

注意:这里我们使用DuplexClientBase来支持双工,DuplexClientBase类需要一个参数的构造方法,InstanceContext就是服务类的OperationContext,这里要赋值给他。

2、页面

    protected void Page_Load(object sender, EventArgs e)
    {
        Calculator client = new Calculator(new InstanceContext(new CalculatorCallback()));
        , );
        Response.Write(dou.ToString());
    }

这里创建Calculator,new一个回调函数来创建InstanceContext,告诉服务我们的回调类。

还有一个配置文件的代码

1、Client

  <client>            <endpoint address="net.tcp://localhost:4503/service/CalculatorService.svc" binding="netTcpBinding" bindingConfiguration="" contract="WCFIContract.ICalculator" name="defaultEndpoint"/>    </client>

2、Service

  <services>
      <service name="WCFService.WCalculatorService">
        <endpoint address="net.tcp://localhost:4503/service/CalculatorService.svc" binding="netTcpBinding" contract="WCFIContract.ICalculator" />
      </service>
    </services>

接下来会记录一篇net.tcp协议寄宿到IIS的学习笔记,配置文件的解释打算放在这篇笔记中。

一个简单的双工例子,自己记录一下,这只是一篇学习文章,提供了解交流,没有权威性,欢迎指正。

共勉

WCF双工学习笔记的更多相关文章

  1. WCF揭秘学习笔记(1):基础知识

    最近找工作,面试时经常被问懂不懂WCF.不少招聘高级.NET工程师的要求上都 写着有WCF开发经验的优先考虑.我对于WCF仅仅是通过看一些教学视频这种山寨学习法了解一些.现在要下决心好好学习一下WCF ...

  2. WCF双工通信笔记

    1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...

  3. WCF揭秘学习笔记(5):WF定制活动

    WF(Windows Workflow Foundation,Windows工作流基础)为.NET提供了一种基于模型的.声明方式的过程执行引擎,它改变了传统的通过一行行编写代码来开发服务功能的方式. ...

  4. WCF揭秘学习笔记(4):可信赖会话、会话管理、队列、事务

    可信赖会话 WCF的可信赖会话在绑定层保证消息只会被传输一次,并且保证消息间的顺序.当使用TCP通信时,协议本身保证了可靠性,但它只在两点间的网络 包这个层面提供了这样的保证.WCF的可信赖会话特性保 ...

  5. WCF揭秘学习笔记(3):使用DataContractSerializer

    使用DataContractSerializer 终结点(包括地址.绑定.契约)可通过代码以编程方式添加到服务中.如: using(ServiceHost host =new ServiceHost( ...

  6. WCF揭秘学习笔记(2):数据表示

    背景知识 WCF提供了一种语言为软件通信建模,称作服务模型.使用更底层的编程架构提供的类可以从这种语言建立的模型中生成可用的通信软件. 在服务模型使用的语言中,负责通信的软件部分称为服务(servic ...

  7. WCF 学习笔记之双工实现

    WCF 学习笔记之双工实现 其中 Client 和Service为控制台程序 Service.Interface为类库 首先了解契约Interface两个接口 using System.Service ...

  8. Dynamic CRM 2013学习笔记(二十二)插件里调用WCF服务

      1. 添加service:     2.调用WCF BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Name = &q ...

  9. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

随机推荐

  1. ar命令提取.a时刻,一个错误 is a fat file (use libtool(1) or lipo(1) and ar(1) on it)

    在减压.a当文件,据报一个类别似 xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)的错误,经过查找资料,原来是由于该.a文 ...

  2. c语言复杂声明解析

    这是个好东西,接触c语言好几年了,第一次看到这东西,惊喜万分. 先提供个分析案例,以后看方便 vector <int> * (*seq_array[]) (int )={func1,fun ...

  3. JavaScript语言基础知识11

    JavaScript字符的比较. 在接下来的学习内容的开始,我们先来看一下alert()此功能,它是一个消息框. OK,接下来正式介绍代码: <HTML> <HEAD> < ...

  4. checkbox 选择功能和反选

    使用jQuery实现checkbox全补选和反选功能.什么时候checkbox选择禁用时,不涉及功能 <!DOCTYPE html> <html> <head> & ...

  5. PHP 13: 类

    原文:PHP 13: 类 Notice: This article is working on progress!本章将介绍PHP类.现在,基本上每种语言都支持面向对象,当然PHP也不列外.PHP在以 ...

  6. 创业路(VC Pipeline),创业需要融资的阅读

    企业家们经常问我,您的投资渠道(投资流程)到底是怎么样的? 看看有多少项目,有多少人遇到,频度,终于选择哪些公司进行了投资. 这让我认为有必要提高VC投资通道的可见度.同一时候也有助于介绍到底哪些方面 ...

  7. Android--扫描二维码

    http://www.cnblogs.com/keyindex/archive/2011/06/08/2074900.html

  8. Strongly connected(hdu4635(强连通分量))

    /* http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/ ...

  9. TortoiseGit for windows安装与配置

    1. 下载地址 TortoiseGit与Language Packs下载: https://code.google.com/p/tortoisegit/wiki/Download?tm=2 msysg ...

  10. .NET MVC4 实训记录之五(访问自定义资源文件)

    .Net平台下工作好几年了,资源文件么,大多数使用的是.resx文件.它是个好东西,很容易上手,工作效率高,性能稳定.使用.resx文件,会在编译期动态生成已文件名命名的静态类,因此它的访问速度当然是 ...