Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >.NET Remoting 体系结构 之 在远程方法中传递对象

.NET Remoting 体系结构 之 在远程方法中传递对象

作者头像
DougWang
发布于 2020-02-17 09:34:46
发布于 2020-02-17 09:34:46
1.1K0
举报
文章被收录于专栏:java跬步java跬步

远程方法调用中的参数类型不仅可以是基本的数据类型,还可以是我们自己定义的类。为了进 行远程处理,必须区分下面 3 种类型的类:

●  按值编组的类——这种类通过信道进行序列化。要编组的类必须用 Serializable 特性标记。 这些类的对象没有远程标识,因为完整的对象通过信道编组,而且与客户端序列化的对象 独立于服务器对象(或相反)。按值编组的类也称作未绑定的类,原因是它们没有依赖于应用 程序域的数据。

●  按引用编组的类——这种类有远程标识。对象不是在网络上传递的,而是返回一个代理。 按引用编组的类必须派生自 MarshalByRefObject。MarshalByRefObjects 称为应用程序域绑 定对象。MarshalByRefObject 的一个专业化版本是 ContextBoundObject :抽象类 ContextBoundObject 派生自 MarshalByRefObject。如果类派生自 ContextBoundObject,则当 上下文边界交叉时,甚至在同一应用程序域中也需要代理。这样的对象称为上下文绑定对 象,它们只在创建上下文中有效。 

●  不能用于远程通信的类——这种类不能序列化,也不派生自 MarshalByRefObject 的。这些 类型的类不能在远程对象的公共方法中用作参数。它们只能用于创建它们的应用程序域中。 如果类的数据成员只在应用程序域中有效(如Win32 文件句柄)则应该使用这种类。 为了阐明类的编组问题,我们将把远程对象改为向客户端发送一个对象:MySerialized 类将按 值编组。在方法中,消息被写入控制台中,以便验证调用是在客户端上进行还是在服务器上进行。 此外,把 Hello 类扩展为返回 MySerialized 实例。

1. 安全性和序列化的对象

.NETRemoting 和ASP.NET Web 服务的一个重要区别是对象编组的方式。在 ASP.NET Web 服务中,只有公共字段和属性通过网络传输。而.NET Remoting 使用另一种序列化机制来序列化所有数据,包括所有私有数据。恶意客户端可以在序列化和反序列化阶段中破坏应用程序。为了解决这个问题,跨.NET Remoting 边界传递对象时,定义两个自动反序列化级别:低级反序列化和完整反序列化。在默认情况下,使用低级反序列化。在低级反序列化中,不能传递 ObjRef 对象,也不能传递实现ISponsor 接口的对象。为了传递这两类对象,可以把反序列化级别改为完整级别。这可以通过编程方式实现:创建一个格式化程序接收器提供程序,并给它赋予 TypeFilterLevel 属性。对于二进制格式化程序,提供程序类是 BinaryServerFormatterSinkProvider,对于 SOAP 格式化程序,提供程序类是 SoapServerFormatterSinkProvider。

2. 方向特性

远程对象从来都不通过网络传输,而值类型和可序列化的类通过网络传输。有时只需要在一个方向上发送数据。这在数据通过网络传输时尤其重要。例如,如果要把集合中的数据发送给服务器,服务器再对这些数据执行一些计算操作,并给客户端返回一个简单的值,把集合发送回客户端就不是很有效。如果数据应发送给服务器、客户端或双向发送,则可以使用 COM 给参数声明方向特性 [in]、[out]和 [in, out]。在 C#中,有相似的特性:ref 和 out 方法参数。ref 和 out 方法参数可以用于可序列化的值类型和引用类型。使用 ref 参数时,数据可以双向编组;使用 out 时,数据从服务器发送到客户端;不使用参数 ref 和out 时,数据从客户端发送到服务器。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.Net Remoting(应用程序域) - Part.1
在互联网日渐普及,网络传输速度不断提高的情况下,分布式的应用程序是软件开发的一个重要方向。在.Net中,我们可以通过Web Service 或者Remoting 技术构建分布式应用程序(除此还有新一代的WCF,Windows Communication Foundation)。本文将简单介绍Remoting的一些基本概念,包括 应用程序域、Remoting构架、传值封送(Marshal by value)、传引用封送(Marshal by reference)、远程方法回调(Callback)、分别在Windows Service和IIS中寄宿宿主程序,最后我们介绍一下远程对象的生存期管理。
张子阳
2018/09/29
6820
.Net Remoting(应用程序域) - Part.1
.NET Remoting 体系结构 之 信道的功能和配置 (二)
●  System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
DougWang
2020/02/18
7340
.NET Remoting 体系结构 之 生命周期管理
对于客户端,答案比较简单。只要客户端调用远程对象上的方法,就会产生一个 System.Runtime.Remoting.RemotingException 类型的异常。此时,只需处理这个异常,完成一些必要 的工作,如重试、写日志以及通知用户等。 对于服务器,服务器应何时检测客户端是否还在?即服务器何时可以清理为该客户端保存的资 源?可以一直等待来自客户端的下一个方法调用,但该客户端可能再没有方法调用了。在 COM 领 域中,DCOM 协议使用 ping 机制解决这个问题。客户端把 ping 和引用对象的信息发送给服务器。 因为客户端在服务器上可能有几百个引用的对象,所以 ping 中的信息非常多。为了使这个机制更加 有效,DCOM 不发送所有对象的所有信息,而只发送与上一个 ping 不同的信息。 虽然这个 ping 机制在 LAN 上非常有效,但它并不适用于可伸缩的解决方案。考虑到有成千上 万的客户端向服务器发送 ping 信息,.NET Remoting 为生命周期管理提供了一个伸缩性更强的解决 方案:即租约分布式垃圾收集器(Leasing Distributed Garbage Collector,LDGC)。 这个生命周期管理只对客户端激活的对象和知名的单一对象有效。因为单一对象不保存状态, 所以在每个方法调用之后就可以销毁它们。客户端激活的对象保存状态,我们应该知道它们使用的 资源。如果在应用程序域外部引用客户端激活的对象,就需要创建租约。租约有一个租约时间。当 租约时间为 0时,租约就已经到期,此时远程对象就会断开连接,后由垃圾收集器回收。
DougWang
2020/02/17
6510
.Net Remoting(基本操作) - Part.2
接下来我们考虑通常的情况,也就是 客户程序 与 宿主程序 位于不同的进程中的情况。
张子阳
2018/09/30
5750
.Net Remoting(基本操作) - Part.2
.NET简谈组件程序设计之(AppDomain应用程序域)
最近在苦学.NET底层框架模型,发现.NET深入真的不是一般的难,不开源、没有相关系统的官方的书籍做学习资料,只能零散的看MSDN。要想摸熟.NET的模型真的并非易事。慢慢来吧。[王清培版权所有,转载请给出署名]
王清培
2022/03/14
3090
.NET简谈组件程序设计之(AppDomain应用程序域)
解析.NET对象的跨应用程序域访问(下篇)
彭泽0902
2018/01/04
1.4K0
解析.NET对象的跨应用程序域访问(下篇)
.NET简谈组件程序设计之(初识远程调用)
在.NET1.0版本出来的时候,要想进行远程调用基本上都是通过WebService的方式。而随着.NET2.0版本的出现,我们可以通过一个更加方便且高扩展性的框架来进行编写远程调用的程序,也就是我们都比较熟悉的.NetRemoting。
王清培
2022/03/14
3050
.NET简谈组件程序设计之(初识远程调用)
c# Romting简单示例
MaybeHC
2024/04/23
1520
c# Romting简单示例
.Net Remoting(分离服务程序实现) - Part.3
在上面Remoting基本操作的范例中,我们发现了这样一个情况:即是 客户应用程序 仍然需要引用 服务程序集(ServerAssembly),因为它需要DemoClass的元信息来创建代理。使用这种共享服务程序集的方式构建Remoting程序,其运行时的示意图如下所示:
张子阳
2018/09/30
4790
.Net Remoting(分离服务程序实现) - Part.3
.NET Remoting 体系结构 之 在 ASP.NET 中驻留远程服务器
     迄今为止,所有服务器示例都是运行在自驻留(self-hosted)的.NET 服务器上。自驻留的服务器必 须手动启动。.NET Remoting 服务器也可以在许多其他的应用程序类型中启动。在 Windows 服务中, 服务器可以在系统启动时自动启动,此外,进程可以通过系统账户的证书运行。
DougWang
2020/02/17
7900
.NET Remoting 体系结构 之 对象的激活
客户端可以使用和创建远程 Activator 类。使用 GetObject()方法,可以得到服务器激活的远程对象或知名的远程对象的代理。CreateInstance()方法返回客户端激活的远程对象的代理。 new 运算符可以代替 Activator 类激活远程对象。为此,还必须使用 RemotingConfiguration 类在客户端中配置远程对象。
DougWang
2020/02/17
7180
快速入门系列--WCF--02消息、会话与服务寄宿
经过WCF基础的ABC学习,已经可以构建简单的WCF的服务,使用不同的服务地址和绑定类型,根据业务提供所需的服务契约。但不禁想问,服务所使用的消息报文是什么样的形式么?蕴含什么样内容呢?WCF服务是否
用户1216676
2018/01/24
1.4K0
快速入门系列--WCF--02消息、会话与服务寄宿
.NET Remoting 体系结构 之 信道的功能和配置 (一)
  信道用于.NET 客户端和服务器之间的通信。.NET Framework 4 发布的信道类使用 TCP 、HTTP 或IPC 进行通信。我们可以为其他的协议创建自定义信道。 HTTP 信道使用 HTTP 协议进行通信。因为防火墙通常让端口 80 处于打开的状态,所以客户端能 够访问 Web 服务器,因为.NET Remoting Web 服务可以侦听端口 80,所以客户端更容易使用它们。 虽然在 Internet 上也可以使用 TCP 信道,但是必须配置防火墙,这样客户端能够访问 TCP 信道 所使用的指定端口。与 HTTP 信道相比,在内部网环境中使用 TCP 信道能够进行更加高效的通信。 IPC 信道适合于在单个系统上进行跨进程的通信。因为它使用 Windows 进程间通信机制,所 以它比其他信道快。当执行远程对象上的方法调用时,导致客户信道对象就把消息发送到远程信道对象中。 服务器应用程序和客户端应用程序都必须创建信道。 下面的代码说明了如何在服务器端创建 TcpServerChannel:
DougWang
2020/02/17
9720
C# Assembly
在C#中,Assembly是.NET框架的一个基本构建模块。它可以被看作是一个包含代码和资源的可部署单元,通常以DLL或EXE文件的形式存在。Assembly承载了以下几个关键特性:
JusterZhu
2025/01/23
900
C# Assembly
.NET简谈组件程序设计之(初识NetRemoting)
在本人的“.NET简谈组件程序设计之(初识远程调用) ”一文中,我们了解到什么是远程调用或者说在.NET平台上远程调用是什么样子的,可能和偏低层(Socket\Rpc)的远程调用有点距离。这只是系统为我们封装了假象而已,看不见不代表没有这逻辑,是为我们减轻了劳动负担。[王清培版权所有,转载请给出署名]
王清培
2022/03/14
3190
.NET简谈组件程序设计之(初识NetRemoting)
asp.net面试题收集 你都会了吗
foreach( object o in array )arrayList.Add(o);
Java架构师必看
2021/03/22
9220
远程方法调用(RMI)原理与示例 转
  远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法。这样可以大致知道RMI是用来干什么的,但是这种理解还不太确切。RMI是Java支撑分布式系统的基石,例如著名的EJB组件。
wuweixiang
2018/08/14
1.1K0
远程方法调用(RMI)原理与示例
                                                                            转
Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十一
原标题:Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十一(Spring中国教育管理中心)
IT胶囊
2021/12/27
4110
Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十一
Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程二十四
原标题:Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程二十四(Spring中国教育管理中心)
IT胶囊
2022/01/04
4910
Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程二十四
.NET Remoting 之了解
  在企业级应用开发中,分布式开发占据了越来越重要的位置。.NET Remoting 是一种可扩展性很强的开发技术。
DougWang
2020/02/18
8410
推荐阅读
相关推荐
.Net Remoting(应用程序域) - Part.1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文