.NET Remoting如何通过Remoting实现双向通信(Bidirectional Communication)

Remoting是NET平台下比较成熟高效的分布式技术,我们习惯采用传统的远程 调用的方式使用Remoting。在客户端所在的Application Domain,我们通过 Proxy(Transparent Proxy)远程地跨Application Domain调用一个方法。当来 自Client端的调用请求通过Proxy到达Server端所在的Application Domain后, Remoting Infrastructure在Server 端激活(Activate)相应的远程对象(一个 继承子System.MarshalByRefObject类对象)——这里仅仅以服务端 激活对象(Server Activated Object——SAO),然后再Server端执行相应的操作后把Result传递给Proxy,并最终到达Client。这是一种典型的 Request/Response的调用方式。

我之所以一直比较推崇在.NET平台下使 用Remoting而非XML Web Service是因为我觉得.NET Remoting是一种比较成熟的 分布式技术。它自身提供了XML Web Service很多不具备的特性,其中对双向通 信的支持就是一个很好的体现。

相对于典型的Request/Response的消息 交换模式(Message Exchange Pattern——MEP),双向通信实质上 是采用的Duplex的MEP。也就是说,Server端在执行操作的时候,可以回调 (Callback)Client端的操作(这个操作时再Client端的Application Domain中 执行的)。

现在我们来看如何一步一步实现在Remoting环境下的双向通 信。在下面的Sample中,我们的逻辑是:调用一个数学计算的远程调用,除了传 递相应的操作数之外,我们还传递一个对象,这个对象可以在Server端中回调 (Callback) 把运算结果在Client端显示出来。

Step1:构建整个 Solution的整体构架。

Artech.DuplexRemoting.Contract:Class Library Project,定义远程对象(Remote Object)和Callback对象的Contract (Interface)。实际上,站在Server端的角度上看,Callback的操作是在 Client端的Application Domain中执行的,所以从本质上讲, Callback对象是 Server端的远程对象。

之所以定义这样一个Contract Project,其目的 主要有以下几点:

1.如果没有把远程对象的Interface,对已某一个需 要调用这个远程对象的Client来说,它必须引用远程对象本身。从安全的角度考 虑,Server向Client过多暴露了操作的实现逻辑。如果我们把远程操作的 Contract提取出来,Client只要引用这个Interface就可以了。

2.一般 来说,远程对象的Contract相对时静态的(static),而业务逻辑的实现则是经 常 变化的。因为Client只需要了解的是远程对象的Contract,所在无论Server 端对远程对象的实现作了多大的变动,对不回对Client产生任何影响。

Artech.DuplexRemoting.Remoting:Class Library Project,定义远程 对象本身。由于远程对象必须实现上边定义的Contract。所以需要引用 Artech.DuplexRemoting.Contract。

Artech.DuplexRemoting.Hosting: Console Application Project,以Self-Host的方式Host Remoting。引用 Artech.DuplexRemoting.Remoting。

Artech.DuplexRemoting.Client: Console Application Project,引用Artech.DuplexRemoting.Contract。

Step 2 在Artech.DuplexRemoting.Contract中定义 Contract

IDuplexCalculator.cs

using System;
using System.Collections.Generic;
using System.Text;
namespace Artech.DuplexRemoting.Contract
{
  public interface IDuplexCalculator
  {
    void Add(double x, double y, ICalculatorCallback callback);
  }
}

ICalculatorCallback.cs

using System;
using System.Collections.Generic;
using System.Text;
namespace Artech.DuplexRemoting.Contract
{
  public interface ICalculatorCallback
  {
    void ShowResult (double x, double y, double result);
  }
}

时间: 2024-10-02 21:11:49

.NET Remoting如何通过Remoting实现双向通信(Bidirectional Communication)的相关文章

我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communication)

昨天写了一篇Remoting中如何实现双向通信的文章<[原创].NET Remoting: 如何通过Remoting实现双向通信(Bidirectional Communication) >,作为对比,今天我们来讨论一下WCF的双向通信. 为了使我们能够更好地对比双向通信在Remoting中和WCF中的实现,我们的Sample采用一样的业务逻辑--调用一个数学计算的远程调用,除了传递相应的操作数之外,我们还传递一个对象,这个对象可以在Server端中回调 (Callback) 把运算结果在Cl

[Remoting FAQ]传递Remoting参数时遇到的两种常见错误

[Remoting FAQ] 传递Remoting参数时遇到的两种常见错误 Version Date Creator Description 1.0.0.1 2006-4-25 郑昀@Ultrapower 草稿   继续阅读之前,我们假设您熟悉以下知识: n         Remoting [现象1] 我们先来描述一个简单的错误.当你激活远端Remoting Objects时,却得到了这样的错误提示: 提示信息 Type 'Common.BTRequest' in Assembly 'Comm

我所理解的Remoting(2):远程对象生命周期的管理[上篇]

1.CLR的垃圾回收机制 在.NET中提到对象的生命周期,我们会不由自主地想到CLR的垃圾回收.在运行一个.NET程序过程中,我们通过某种方式,比如通过new操作符,通过反序列化,通过反射机制,创建一个对象,CLR在为这个对象在托管堆中开辟一块内存空间.随着程序的运行,创建的对象越来越多,托管堆中的可用的内存越来越少,必须有一种机制来判断被分配在托管堆中的对象那些已经不被使用,以及进行对这些对象占用的内存进行回收.这种机制被称为CLR自动内存管理,也就是我们常说的垃圾回收.为了说清楚远程对象的生

我所理解的Remoting(1):Marshaling &amp; Activation[上篇]

什么是Marshaling &Activation 对任何一项分布式技术(Distributed Technology),比如Remoting,XML Web Service,Enterprise Service,Marshaling和Activation(对于Marshaling,我实在是找不到一个比较贴切的中文短语来翻译,很多书把它翻译成封送,我总觉得很别扭,所以在这里我就直接用英文Marshaling,如果读者有较好的翻译,麻烦通知我一下)都是必须要解决的问题.本Blog主要讲述的是在Re

我所理解的Remoting (2) :远程对象的生命周期管理[下篇]

在上一篇文章中([原创]我所理解的Remoting(2):远程对象生命周期的管理-Part I),我简要的讲述了CLR的垃圾回收机制和Remoting 基于Lease的对象生命周期的管理.在这篇文章中,我们将以此为基础,继续我们的话题.在文章的开始,我将以我的理解详细地讲述Remoting中两个重要的概念--Lease和Sponsorship.然后我通过一个Sample,为大家演示如何以不同的方法延长远程对象的生命周期. 我们先不谈远程对象.本地对象. 不管是远程的对象,还是本地对象,都对于程序

我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离

我们知道对于Remoting,有两种不同的Activation模式:Server Activation和Client Activation.他我在前面的系列文章中分析.比较了这两种不同激活方式的区别:Marshaling方式,远程对象创建的时机,状态的保持,生命周期的管理. 在编程模式方面Server Activation和Client Activation也具有一定的差异:为一个SAO(server activated object)和一个CAO(client activated object

我所理解的Remoting(1):Marshaling &amp; Activation[下篇]

在上面一片文章([原创]我所理解的Remoting(1):Marshaling & Activation - Part I),我花了大量的文字来来描述了Remote Object如何通过Marshaling的过程从Server端所在的Application Domain经过相关的转换(Transformation)传递到Client所在的Application Domain供Client调用: 以及Client的调用请求如何在Activate处于Server端Application Domain

大哥们 我只有三分了,谢谢 全给你们 Remoting,我现在想当服务器端有某个事件发生时能够影响到客户端,让客户端能够捕捉到这个事件并进行处理,不知道怎么实现<注意是在B/S中>

问题描述 一个信息管理系统,当用户登陆后 在首页会有类似MSN 一样的提示,您有几条短消息,但是要求时 在添加消息页面,消息一发送 就需要在首页给该用户提示不能采用 定时器 访问服务器端, 而是服务器端怎么响应客户端,感觉只能采用 观察者<订阅方式实现>,用remoting 实现的话,不知道B/S该怎么实现我做了一半usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Sec

做一Remoting的例子发布不成功大家看看

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.Remoting.Channels;usingSystem.Runtime.Remoting.Channels.Tcp;namespaceWrox.ProCSharp.Remoting{publicclassHelloClient{[STAThread]publicstaticvoidMain(string[]args){Ch