广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >WCF实现双向通信
  • 360
分享到

WCF实现双向通信

2024-04-02 19:04:59 360人浏览 安东尼
摘要

请求过程中的回调 这是一种比较典型的双工消息交换模式的表现形式,客户端在进行服务调用的时候,附加上一个回调对象;服务在对处理该处理中,通过客户端附加的回调对象(实际上是调用回调服务的

请求过程中的回调

这是一种比较典型的双工消息交换模式的表现形式,客户端在进行服务调用的时候,附加上一个回调对象;服务在对处理该处理中,通过客户端附加的回调对象(实际上是调用回调服务的代理对象)回调客户端的操作(该操作在客户端执行)。整个消息交换的过程实际上由两个基本的消息交换构成,其一是客户端正常的服务请求,其二则是服务端对客户端的回调。两者可以采用请求-回复模式,也可以采用单向(One-way)的MEP进行消息交换。图1描述了这样的过程,服务调用和回调都采用请求-回复MEP。

图1

我们沿用计算服务的例子。在这之前,我们都是调用CalculuateService直接得到计算结果,并将计算结果通过控制台输出。在本例中我们将采用另外一种截然不同的方式调用服务并进行结果的输出:我们通过单向(One-way)的模式调用CalculuateService(也就是客户端不可能通过回复消息得到计算结果),服务端在完成运算结果后,通过回调(Callback)的方式在客户端将计算结果打印出来。

一:定义服务契约和回调契约

首先进行服务契约的定义,我们照例通过接口(ICalculator)的方式定义服务契约,作用于指定加法运算的Add操作,我们通过OperationContractAttribute特性的IsOneway属性将操作定义成单向的操作,这意味着客户端仅仅是向服务端发送一个运算的请求,并不会通过回复消息得到任何运算结果。

[ServiceContract(Namespace = "Http://www.artech.com/", CallbackContract = typeof(ICallback))]//回调契约的类型通过ServiceContractAttribute特性的CallbackContract属性进行指定。
public interface ICalculator
{
    [OperationContract(IsOneWay = true)]
    void Add(double x, double y);
}
//回调契约
public interface ICallback //由于定义ICalculator的时候已经通过[ServiceContract(CallbackContract=typeof(ICallback))]指明ICallback是一个服务契约了,所以ICallback不再需要添加ServiceContractAttribute特性。
{
    [OperationContract(IsOneWay = true)]//服务端不需要回调的返回值,索性将回调操作也设为单向方法。
    void DisplayResult(double x, double y, double result);
}

二:实现服务

在实现了上面定义的服务契约ICalculator的服务CalculatorService中,实现了Add操作,完成运算和结果显示的工作。结果显示是通过回调的方式实现的,所以需要借助于客户端提供的回调对象(该对象在客户端调用CalculatorService的时候指定,在介绍客户端代码的实现的时候会讲到)。在WCF中,回调对象通过当前OperationContext的GetCallback<T>方法获得(T代表回调契约的类型)。

public class CalculatorService : ICalculator
{
    public void Add(double x, double y)
    {
        double result = x + y;
        ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
        callback.DisplayResult(x, y, result);
    }
}

注: OperationContext在WCF中是一个非常重要、也是一个十分有用的对象,它代表服务操作执行的上下文。我们可以通过静态属性Current(OperationContext.Current)得到当前的OperationContext。借助OperationContext,我们可以在服务端或者客户端获取或设置一些上下文,比如在客户端可以通过它为出栈消息(outGoing message)添加SOAP报头,以及HTTP报头(比如Cookie)等。在服务端,则可以通过OperationContex获取在客户端设置的SOAP报头和HTTP报头。关于OperationContext的详细信息,可以参阅MSDN在线文档。

三:服务寄宿

我们通过一个控制台应用程序完成对CalculatorService的寄宿工作,并将所有的服务寄宿的参数定义在配置文件中。由于双工通信依赖于一个双工的信道栈,即依赖于一个能够支持双工通信的绑定,在此我们选用了NettcpBinding。

<system.serviceModel>
       <behaviors>
       <services>
           <service name = "Artech.DuplexServices.Services.CalculatorService">
                <endpoint address = "net.tcp://127.0.0.1:9999/CalculatorService"  binding = "netTcpBinding" contract = "Artech.DuplexServices.Contracts.ICalculator"/>
             </service>
         </services>
 </system.serviceModel>

注: 在WCF预定义绑定类型中,WSDualHttpBinding和NetTcpBinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。WSDualHttpBinding是基于HTTP传输协议的;而HTTP协议本身是基于请求-回复的传输协议,基于HTTP的通道本质上都是单向的。WSDualHttpBinding实际上创建了两个通道,一个用于客户端向服务端的通信,而另一个则用于服务端到客户端的通信,从而间接地提供了双工通信的实现。而NetTcpBinding完全基于支持双工通信的TCP协议。

using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
    host.Open();
    Console.Read();
}

四:实现回调契约与服务调用

在客户端程序为回调契约提供实现,在下面的代码中CalculateCallback实现了回调契约ICallback,在DisplayResult方法中对运算结果进行输出。

class CalculateCallback : ICallback
{
    public void DisplayResult(double x, double y, double result)
    {
        Console.WriteLine("x + y = {2} when x = {0} and y = {1}", x, y, result);
    }
}

接下来实现对双工服务的调用,下面是相关的配置和托管程序。在服务调用程序中,通过DuplexChannelFactory<TChannel>创建服务代理对象,DuplexChannelFactory<TChannel>和ChannelFactory<TChannel>的功能都是一个服务代理对象的创建工厂,不过DuplexChannelFactory<TChannel>专门用于基于双工通信的服务代理的创建。在创建DuplexChannelFactory<TChannel>之前,先创建回调对象,并通过InstanceContext对回调对象进行包装。

<system.serviceModel>
     <client>
         <endpoint name = "CalculatorService" address = "net.tcp://127.0.0.1:9999/CalculatorService" binding = "netTcpBinding" contract = "Artech.DuplexServices.Contracts.ICalculator"/>
     </client>
 </system.serviceModel>
InstanceContext instanceContext = new InstanceContext(new CalculateCallback());
using (DuplexChannelFactory<ICalculator> channelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "CalculatorService"))
{
    ICalculator proxy = channelFactory.CreateChannel();
    using (proxy as IDisposable)
    {
        proxy.Add(1, 2);
        Console.Read();
    }
}

注意:如果采用WsDualHttpBinding,由于回调的服务监听地址采用的默认端口是80,在IIS 5.x以及之前的版本中,80端口是IIS独占的监听端口。WsDualHttpBinding定义了一个ClientBaseAddress使你能很容易地改变回调服务的基地址。对于我们给出的案例,我们只要通过下面的配置将clientBaseAddress设为可用的地址(http://127.0.0.1:8888/ CalculatorService) 
< bindings >
     < wsDualHttpBinding >
         < binding name = "MyBinding" clientBaseAddress = "http://127.0.0.1:8888/calculatecallback" />
        </ wsDualHttpBinding >
  </ bindings >

到此这篇关于WCF实现双向通信的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: WCF实现双向通信

本文链接: https://www.lsjlt.com/news/148639.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WCF实现双向通信
    请求过程中的回调 这是一种比较典型的双工消息交换模式的表现形式,客户端在进行服务调用的时候,附加上一个回调对象;服务在对处理该处理中,通过客户端附加的回调对象(实际上是调用回调服务的...
    99+
    2022-11-13
  • WCF如何实现双向通信
    这篇文章主要介绍“WCF如何实现双向通信”,在日常操作中,相信很多人在WCF如何实现双向通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”WCF如何实现双向通信”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • Linux怎么实现TCP双向通信
    这篇文章主要讲解了“Linux怎么实现TCP双向通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux怎么实现TCP双向通信”吧!双向通信一般指双向交替通信。双向交替通信又称为半双工通...
    99+
    2023-06-28
  • Android Messenger实现进程间双向通信
    简介 Messenger是安卓进程间通信 (IPC) 最为简单的方式,可以实现进程间双向通信。详见官网介绍 代码实现 服务端应用实现 MessengerService接收客户端发送的...
    99+
    2022-11-12
  • 使用Messenger实现Service的双向通信
    Android体系架构中有一个解决方案:利用Android Messenger实现Service进程间双向通信。 MainActivity 类: package com.exam...
    99+
    2022-11-12
  • Node与Python双向通信的实现方法
    这篇文章主要介绍“Node与Python双向通信的实现方法”,在日常操作中,相信很多人在Node与Python双向通信的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node与Python双向通信的实...
    99+
    2023-06-20
  • Node与Python 双向通信的实现代码
    目录进程通信进程双向通信存在问题总结第三方数据供应商把数据和Python封装到一起,只能通过调用 Python方法来实现数据查询,如果可以通过Node 简单封装下实现 Python 方法调用可以快速上线并节省开发成本...
    99+
    2022-06-02
    Node Python双向通信 Node Python 通信
  • socketpair创建双向通信的管道(全双工通信)
    socketpair函数是用来创建一对相互连接的套接字的,这对套接字可以用于双向通信。这对套接字之间是全双工通信的,可以同时进行读写...
    99+
    2023-09-12
    socketpair
  • Android中怎么利用socketpair实现双向通信
    Android中怎么利用socketpair实现双向通信,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。进程:负责读取和分发事件2、应用程序:负责处理输入事件上面这两个进程会...
    99+
    2023-05-30
    socketpair android
  • 如何在golang中实现WebSocket的双向通信
    如何在 Golang 中实现 WebSocket 的双向通信WebSockets 是一种在客户端和服务器之间建立持久化连接的通信协议,它允许双向通信,而且在实时性和效率方面表现出色。在 Golang 中,我们可以使用标准库中的 net/ht...
    99+
    2023-12-18
    Golang websocket 双向通信
  • websocket结合node.js实现双向通信的示例代码
    首先我们需要了解,什么是websocket,它的作用和优势是什么,为什么要用它。 什么是websocket websocket是基于TCP的一种双向通信协议。在此之前,一直是采用轮询...
    99+
    2023-02-10
    websocket node.js双向通信 node.js双向通信
  • C++实现通用双向链表
    使用C++完成双向通用链表双向链表不用多说,通用链表因为数据结构不确定的,使用一个VOID指针指向数据,什么数据都可以挂上去,这样来封装链表,可以作为基础类也可以单独使用,这里只是为了练习C++封装的语法,实现了简单的增加和删除链表由于实际...
    99+
    2023-06-04
  • Android 通过Messager与Service实现进程间双向通信案例详解
    目录Messenger使用步骤Service代码客户端代码分析结果注意事项Android中的Service和其调用者既可以在同一个App中,也可以在不同的App。如果Service在...
    99+
    2022-11-12
  • Android与Vue借助WebView双向通信
    Android 与 Vue 双向通信 原生与vue交互其实就是和js交互,方法相同 本来想要使用DSBridge进行通信,但这个作者好像不维护了,引用不了这个库,索性直接使用webview的方法 下面是两个demo的总结,混合开发一...
    99+
    2023-08-30
    android vue.js webview
  • ReactNative中WebView与html双向通信遇到的坑
    目录一、参数配置二、坑点三、React Native与html双向通信3.1、RN发数据到WebView3.2、WebView发数据到RN四、demo源码安卓、ios原生与html双...
    99+
    2023-01-29
    React WebView与html双向通信 React WebView与html
  • MYSQL INNODB中通用双向链表怎么实现
    这篇文章给大家分享的是有关MYSQL INNODB中通用双向链表怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。源码在Ut0lst.h中注意:这里我将链表中的实际的串联的数...
    99+
    2022-10-18
  • Vue3父子组件间通信和组件间双向绑定怎么实现
    本篇内容主要讲解“Vue3父子组件间通信和组件间双向绑定怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3父子组件间通信和组件间双向绑定怎么实现”吧!假如确要修改,可以使用下面说的方...
    99+
    2023-07-06
  • Python实现双向链表
    之前写的单向链表和环形链表都只是单向的,只能单向遍历,不能根据后面的节点获取前面的节点,除非进行反转操作。 双向链表每个节点都有两个指针,这两个指针分别指向前后两个节点,这样就可以从...
    99+
    2022-11-11
  • Java实现双向链表
    本文实例为大家分享了Java实现双向链表的具体代码,供大家参考,具体内容如下 1、双向链表 1.1 双向链表的每个节点组成包含节点数据,上一个节点(pre),下一个节点(next) ...
    99+
    2022-11-13
  • 通过logstash实现mysql与es的双向数据同步
    参考题目 一种基于MySQL和Elasticsearch的数据同步方法及系统基于MySQL和Elasticsearch的数据同步方法一种基于MySQL和Elasticsearch的数据同步系统基于MySQL和Elasticsearch...
    99+
    2023-09-11
    logstash mysql es elasticSearch linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作