`
varsoft
  • 浏览: 2451306 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[Remoting] 二:远程对象

阅读更多
在分布系统中,远程对象需要跨越应用程序域进行传递,因此其表示方式会有所不同。基于性能和数据共享等原因考虑,Remoting 中远程对象可以是 "值封送对象(MBV)" 或 "引用封送对象(MBR)"。

MBV 机制类似于 Web 无状态请求,服务器创建对象实例传递给信道发送到客户端,而后服务器端不再继续维护其状态和生存期。而 MBR 则在其生存期内一直存活在服务器程序域中,客户端只是通过代理对象来完成调用消息传递,客户端可以通过相关接口来延长远程对象的生存期。

实现 MBV 一般通过 SerializableAttribute 特性,或者实现 ISerializable 接口。运行下面的例子,我们会发现远程对象在客户端程序域内,并且不是代理对象。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;

namespace Learn.Library.Remoting
{
public class RemotingTest2
{
/// <summary>
/// 远程类型
/// </summary>
[Serializable]
public class Data
{
private int i;

public int I
{
get { return i; }
set { i = value; }
}

public void Where()
{
Console.WriteLine("{0} in {1}", this.GetType().Name, AppDomain.CurrentDomain.FriendlyName);
}
}

/// <summary>
/// 服务器端代码
/// </summary>
static void Server()
{
// 创建新的应用程序域,以便模拟分布结构。
AppDomain server = AppDomain.CreateDomain("server");
server.DoCallBack(delegate
{
// 创建并注册信道
TcpServerChannel channel = new TcpServerChannel(801);
ChannelServices.RegisterChannel(channel, false);

// 注册远程类型
RemotingConfiguration.ApplicationName = "test";
RemotingConfiguration.RegisterActivatedServiceType(typeof(Data));
});
}

/// <summary>
/// 客户端代码
/// </summary>
static void Client()
{
// 创建并注册信道
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);

// 注册远程类型
RemotingConfiguration.RegisterActivatedClientType(typeof(Data), "tcp://localhost:801/test");

// 创建远程对象并调用其方法
Data data = Activator.CreateInstance(typeof(Data)) as Data;
data.Where();

// 判断是否是代理
Console.WriteLine(RemotingServices.IsTransparentProxy(data));
}

static void Main()
{
Server();
Client();
}
}
}

输出:
Data in Learn.CUI.vshost.exe
False

MBR 则要求继承自 MarshalByRefObject 或 ContextBoundObject。继承自 ContextBoundObject 的远程对象,可以包含其执行上下文,比如事务等等,其性能不如 MarshalByRefObject。下面的例子中,远程对象依旧在服务器程序域内执行,客户端只是一个代理对象在转发调用。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;

namespace Learn.Library.Remoting
{
public class RemotingTest2
{
/// <summary>
/// 远程类型
/// </summary>
public class Data : MarshalByRefObject
{
private int i;

public int I
{
get { return i; }
set { i = value; }
}

public void Where()
{
Console.WriteLine("{0} in {1}", this.GetType().Name, AppDomain.CurrentDomain.FriendlyName);
}
}

/// <summary>
/// 服务器端代码
/// </summary>
static void Server()
{
// 创建新的应用程序域,以便模拟分布结构。
AppDomain server = AppDomain.CreateDomain("server");
server.DoCallBack(delegate
{
// 创建并注册信道
TcpServerChannel channel = new TcpServerChannel(801);
ChannelServices.RegisterChannel(channel, false);

// 注册远程类型
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Data), "data",
WellKnownObjectMode.Singleton);
});
}

/// <summary>
/// 客户端代码
/// </summary>
static void Client()
{
// 创建并注册信道
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);

// 创建远程对象并调用其方法
Data data = (Data)Activator.GetObject(typeof(Data), "tcp://localhost:801/data");
data.Where();

// 判断是否是代理
Console.WriteLine(RemotingServices.IsTransparentProxy(data));
}

static void Main()
{
Server();
Client();
}
}
}

输出:
Data in server
True

MBV 传递完整的副本到客户端,而后的所有调用都是在客户端程序域内进行,不再需要跨域的往返过程。但完整复制和序列化需要更多的资源和往返时间,因此不适合较大的对象,同时无法在多个客户端间共享信息。而 MBR 的所有调用都是通过代理进行的,因此往返过程比较多,但因执行过程都在服务器端进行,其整体性能还是非常高的。在系统设计时可以针对不同的应用采取不同的选择。
分享到:
评论

相关推荐

    Remoting简单远程对象实例

    Remoting简单远程对象实例,Remoting简单远程对象实例

    Remoting入门程序

    1.定义远程对象:继承自MarshaByRefObject 2.创建一个Server端作为宿主 注册远程对象(作为对象的宿主) 注册通道 3.创建客户端 注册通道 通过URL获取Server端远程对象的代理 通过代理操作远程对象,使得在...

    vs2010简单实现Remoting源码

    Remoting源码,远程对象,远程控制

    使用.NET Remoting从服务器主动发出事件通知客户端远程广播

    其实.NET Remoting远程处理完全支持事件驱动的编程和使用同步和异步委托的回调函数。在.NET Remoting中你可以方便的采用事件注册远程回调函数,并方便的利用这种机制将服务器端信息广播到客户端。

    Net Remoting 入门与提高

    一、Remoting基础 二、远程对象的定义 三、服务器端 四、客户端 Marshal、Disconnect与生命周期以及跟踪服务

    15套 c# 操作 Remoting 的源代码事例,相信对你有用!

    远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。 在Remoting中,对于要传递的对象,设计者除了需要了解...

    remoting技术

    应用程序域、Remoting构架、传值封送(Marshal by value)、传引用封送(Marshal by reference)、Remoting的基本操作、分离服务程序元信息和实现、在Windows Service和IIS中寄宿宿主程序、远程方法回调(Callback)、远程...

    .NET Remoting与分布式应用开发——初识 Remoting

    其主要的结构,分为:远程对象、提供远程对象的远程服务器,以及可以访问何使用远程对象的客户端。这三个部分,可以分布于同一台计算机的同一个进程,或者是不同的进程,也可以是处于网络上的不同的计算机。Remoting...

    NET的远程对象编程示例代码

    NET的远程对象编程示例代码

    Microsoft.NETRemoting:技术概述

    目录简介远程对象代理对象通道激活对象的租用生存期总结附录A:使用TCP通道进行远程处理的示例附录B:使用HTTP通道进行远程处理的示例简介Microsoft?.NETRemoting提供了一种允许对象通过应用程序域与另一对象进行...

    Remoting实例

    采用工厂模式及反射机制在服务端创建远程对象,在客户短只需调用Factory.CreateInstance(Type(InterfaceName),object[] args)即可创建远程对象,Factory工厂类采用了WellKnown服务端的SinglTon激活模式,其他的远程...

    Microsoft .Net Remoting系列教程之二:Marshal、Disconnect与生命周期以及跟踪服务

    由于Remoting没有提供与之对应的Unregister方法来注销远程对象,所以如果需要注册/注销指定对象,微软推荐使用Marshal(一般译为编组)和Disconnect配对使用。在《Net Remoting基础篇》中我已经谈到:Marshal()方法...

    remoting 网络编程

    1、能让我们进行分布式开发 2、Tcp 通道的Remoting 速度非常快 3、虽然是远程的,但是非常接近于本地调用对象 4、可以做到保持对象的...5、没有应用程序限制,可以是控制台,winform,iis,windows 服务承载远程对象

    一步一步学Remoting

    一步一步学Remoting之一:从简单开始 一、Remoting的优缺点? 优点: 1、能让我们进行分布式...5、没有应用程序限制,可以是控制台,winform,iis,windows服务承载远程对象 缺点: 1、非标准的应用因此有平台限制

    haxe_remoting:用于 haxe 的其他异步远程处理工具

    用于在 websocket 客户端和服务器 (Node.js) 之间传递 JSON 和 Haxe 序列化对象的 Websocket 包装器 有关工作示例,请参阅演示。 安装/编译 要构建演示: 。 。 配置并运行 wafl(在库根目录中): wafl 配置 -...

    Net Remoting.zip

    4.Net Remoting(远程方法回调) 5.細細品味C#(Remoting專題) 1.1、版权声明...............................................................................................................2 1.2、内容详情....

    Remoting简易示例

    初学Remoting比较好的小案例,主要介绍了远程对象、服务器、客户机三方的实现方式,简单易懂,主要学习其中的思想。

    Net Remoting体系架构

    本文主要讲述.NET环境下remoting通信技术的架构。 Remoting边界,可远程化的对象类型 ,跨越Remoting边界通信,用ObjRef列集对象引用。

    。netRemoting 实例

    Remoting和WebService都是.Net提供的远程访问的方法,...4、没有应用程序限制,可以是控制台,winform,iis,windows服务承载远程对象 缺点: 1、不是标准的应用,因此有平台限制 2、脱离iis的话需要有自己的安全机制

Global site tag (gtag.js) - Google Analytics