wcf中的使用全双工通信

 

wcf中的契约通信默认是请求恢复的方式,当客户端发出请求后,一直到服务端回复时,才可以继续执行下面的代码。

除了使用请求应答方式的通信外,还可以使用全双工。下面给出例子:

1.添加一个wcf类库

2.在服务契约添加如下一个片段

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required, 
        CallbackContract = typeof(ICalculatorDuplexCallback))]

public interface ICalculatorDuplex 
   { 
       [OperationContract(IsOneWay = true)] 
       void Clear(); 
       [OperationContract(IsOneWay = true)] 
       void AddTo(double n); 
       [OperationContract(IsOneWay = true)] 
       void SubtractFrom(double n); 
       [OperationContract(IsOneWay = true)] 
       void MultiplyBy(double n); 
       [OperationContract(IsOneWay = true)] 
       void DivideBy(double n); 
   }

其中ICalculatorDuplexCallback为实现全双工客户端的接口

3.定义ICalculatorDuplexCallback接口。该接口目的主要是回调客户端的方法。和服务端无关,所以让该接口的方法设置为单向的

public interface ICalculatorDuplexCallback 

    [OperationContract(IsOneWay = true)] 
    void Equals(double result); 
    [OperationContract(IsOneWay = true)] 
    void Equation(string eqn); 

4.由于回话是必须的,那么在契约实现的时候也要加上一个特性

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

public class Service1 : IService1 
   { 
       double result; 
       string equation; 
       ICalculatorDuplexCallback callback = null;

public Service1() 
       { 
           result = 0.0D; 
           equation = result.ToString(); 
           callback = OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>(); 
       }

public void Clear() 
       { 
           callback.Equation(equation + " = " + result.ToString()); 
           result = 0.0D; 
           equation = result.ToString(); 
       }

public void AddTo(double n) 
       { 
           result += n; 
           equation += " + " + n.ToString(); 
           callback.Equals(result); 
       }

public void SubtractFrom(double n) 
       { 
           result -= n; 
           equation += " - " + n.ToString(); 
           callback.Equals(result); 
       }

public void MultiplyBy(double n) 
       { 
           result *= n; 
           equation += " * " + n.ToString(); 
           callback.Equals(result); 
       }

public void DivideBy(double n) 
       { 
           result /= n; 
           equation += " / " + n.ToString(); 
           callback.Equals(result); 
       } 
}

5.接着在项目中添加一个控制台程序,添加服务。服务会报异常

System.InvalidOperationException: 协定需要会话,但是绑定“BasicHttpBinding”不支持它或者因配置不正确而无法支持它。 
   在 System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result) 
   在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) 
   在 System.ServiceModel.ServiceHostBase.InitializeRuntime() 
   在 System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 
   在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
   在 Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

需要把服务端配置文件中改一下:

<system.serviceModel>
<services>
<service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">

<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
<endpoint address="" binding="wsDualHttpBinding" contract="WcfService1.IService1">
<!--
部署时,应删除或替换下列标识元素,以反映
用来运行所部署服务的标识。删除之后,WCF 将
自动推断相应标识。
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfService1.Service1Behavior">
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="False" httpsGetEnabled="False"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

6.在控制台端,添加服务引用,实现服务定义的ICalculatorDuplexCallback接口(该接口自动生成的对应到服务引用中的IService1Callback)

public class CallbackHandler : IService1Callback 
  { 
      public void Equals(double result) 
      { 
          Console.WriteLine("Result({0})", result); 
      }

public void Equation(string eqn) 
      { 
          Console.WriteLine("Equation({0})", eqn); 
      } 
  }

7.在main函数中,去调用服务

InstanceContext instanceContext = new InstanceContext(new CallbackHandler());

// Create a client 
            ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(instanceContext);

Console.WriteLine("Press <ENTER> to terminate client once the output is displayed."); 
            Console.WriteLine();

// Call the AddTo service operation. 
            double value = 100.00D; 
            client.AddTo(value);

// Call the SubtractFrom service operation. 
            value = 50.00D; 
            client.SubtractFrom(value);

// Call the MultiplyBy service operation. 
            value = 17.65D; 
            client.MultiplyBy(value);

// Call the DivideBy service operation. 
            value = 2.00D; 
            client.DivideBy(value);

// Complete equation 
            client.Clear();

Console.ReadLine();

//Closing the client gracefully closes the connection and cleans up resources 
            client.Close();

8.运行结果

wcf中的使用全双工通信(转)的更多相关文章

  1. wcf中的使用全双工通信

    wcf中的契约通信默认是请求恢复的方式,当客户端发出请求后,一直到服务端回复时,才可以继续执行下面的代码. 除了使用请求应答方式的通信外,还可以使用全双工.下面给出例子: 1.添加一个wcf类库 2. ...

  2. 我的WCF之旅(3):在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  3. 在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  4. WCF学习之旅—WCF中传统的异常处理(十六)

    WCF中的异常处理 在软件开发过程中,不可能没有异常的出现,所以在开发过程中,对不可预知的异常进行解决时,异常处理显得尤为重要.对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地 ...

  5. WCF初探-26:WCF中的会话

    理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...

  6. WCF中常用的binding方式

    WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务.WSHttpBinding: 比 Basi ...

  7. 重温WCF之WCF中可靠性会话(十四)

    1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序.当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性.然而 ...

  8. WCF初探-22:WCF中使用Message类(上)

    前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...

  9. 跟我一起学WCF(11)——WCF中队列服务详解

    一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务队列的方法来支持客户端 ...

随机推荐

  1. js实现选集功能

    项目中有个播放列表选集的需求,如下图: 现在展示的1-42集全部,我们如何实现这个选集的功能呢? 我的思路如下: 1.将这42集按每10集划分,并存入数组: 2.保存开始和结束位置,比如说1~10,开 ...

  2. 微信小程序——wxParse使用方法

    wxParse是一个微信小程序富文本解析组件.现在小程序里面自带了一个<rich-text>组件也能解析富文本,但是表现不尽人意.所以我还是采用的wxParse来解析富文本的. wxPar ...

  3. node学习笔记4——get数据传递

    nodejs中,关于将接收到的数据处理为json格式用到的是 url 模块. 主要用到是下面3个东东: url.parse   url.pathname url.query 我们看一个简单的例子: 先 ...

  4. html5和css3实现的3D滚动特效

    今天给大家带来一款html5和css3实现的3D滚动特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="container"&g ...

  5. USB2.0学习笔记连载(四):安装Cypress官网套件

    上一篇博客大概讲了一下USB通用驱动程序的解析.笔者使用Cypress官网给定的资料去完成USB驱动开发.官网资料地址:http://www.cypress.com/?rID=14321 下载如下图的 ...

  6. MD2关键桢动画3D模型加载.

    在看Cg教程中,看到关键桢插值来表示一个动画的物体,例如一个动物拥有站着,奔跑,下跪等动画序列,美工将这些特定的姿态称为一个关键桢.为什么要用关键桢这种来表示了,这个比较容易理解,我们知道我们看的一些 ...

  7. python3 异步模块asyncio

    yield方法引入, 这里存在的问题是,如果你想创建从0到1,000,000这样一个很大的序列,你不得不创建能容纳1,000,000个整数的列表. 但是当加入了生成器之后,你可以不用创建完整的序列,你 ...

  8. Python中的高级turtle(海龟)作图

    在Python里,海龟不仅可以画简单的黑线,还可以用它画更复杂的几何图形,用不同的颜色,甚至还可以给形状填色. 一.从基本的正方形开始 引入turtle模块并创建Pen对象: >>> ...

  9. 第三百七十七节,Django+Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成

    第三百七十七节,Django+Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成 apps目录建立 我们创建一个apps目录,将所有的app放到apps目录里去,这样方便管理,也 ...

  10. Java如何显示不同语言的时间?

    在Java中,如何显示不同语言的时间? 此示例使用DateFormat类以中文语言显示时间. package com.yiibai; import java.text.DateFormat; impo ...