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. 【转】Appium测试安卓Launcher以滑动窗体获得目标应用

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39755553 所谓Launcher,指的是安卓的桌面管理程序,所有的应用图标都放在laun ...

  2. POJ 2187: Beauty Contest(旋转卡)

    id=2187">Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27218   ...

  3. Facebook HHVM 和 Hack 手册 --- 2. HHVM能做什么

    HHWM简介: HHWM(HipHop VM) 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点. ...

  4. 在线Youtube视频下载,修改文本,剪切制作动画的最新方法

    刚刚(减去编写本文章的时间,大概20分钟前吧)在看国外最新技术资讯的时候发现有个方法可以让我们快速去下载Youtube上面的视频,不敢独享,我自己都没有怎么玩就所以立刻post上来广而告之,希望对大家 ...

  5. effective C++ 札记 规定17 在单独的陈述newed对象插入智能指针

    // Test.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  6. java基础知识汇总

    1.     类的访问控制权限共有两种:public和默认.默认级别的类只能被同一个包中的类看到,包外不可见. 2.     类成员的访问权限共有四种:public,protected,private ...

  7. 1.3 LINQ查询

    LINQ最具突破性的优势在于将文本查询与对象操作完美集成,它让查询数据和操作对象一样安全和轻松.查询(Query)是LINQ的核心概念之一. 传统意义上的数据查询语言,通常是比较易懂,具有一定语义的文 ...

  8. Windows 7上使用HP QC的问题

    C(Quantity Center)是一款不错的测试管理工具,最近把公司的操作系统从Windows XP升级到Windows 7之后,发现登录到QC Server的Addin页面,很多客户端组件不能正 ...

  9. ef左联三张表案例

    users:用户表 Orderss:订单表 U_O:用户和订单的中间表 OrdersEntities1 oe = new OrdersEntities1();            var resul ...

  10. 在PHP中如何连接到数据库

    首先我们先运行WampServer中的phpMyAdmin随即弹出phpMyAdmin页面   在弹出的页面中左边是数据库列表  右边是相应的设置 选择一个数据库  在里面创建一张数据表  注意创建数 ...