2007年6月5日
摘要: 有太多的原因让我忽略了 Remoting,不过现在用它来开始 SOA 和 WCF 的旅途还是不错的选择。.NET Remoting 封装了分布式开发的消息编码和通讯方式,让我们用非常简单的方式既可完成不同模式的分布系统开发,同时其可配置、可扩展的特性也让我们拥有极大的灵活性。当然,我更看好其升级版本 —— WCF。 要了解 Remoting 的基本信息和介绍,还是看 MSDN 比较好。先写一个简单的 Example 来体验一下,为了方便,我直接在一个工程里面创建不同的应用程序域来模拟分布模式。 阅读全文
posted @ 2007-06-05 09:30 编程山人 阅读(455) 评论(0) 推荐(1) 编辑
摘要: 在分布系统中,远程对象需要跨越应用程序域进行传递,因此其表示方式会有所不同。基于性能和数据共享等原因考虑,Remoting 中远程对象可以是 "值封送对象(MBV)" 或 "引用封送对象(MBR)"。 MBV 机制类似于 Web 无状态请求,服务器创建对象实例传递给信道发送到客户端,而后服务器端不再继续维护其状态和生存期。而 MBR 则在其生存期内一直存活在服务器程序域中,客户端只是通过代理对象来完成调用消息传递,客户端可以通过相关接口来延长远程对象的生存期。 实现 MBV 一般通过 SerializableAttribute 特性,或者实现 ISerializable 接口。运行下面的例子,我们会发现远程对象在客户端程序域内,并且不是代理对象。 阅读全文
posted @ 2007-06-05 09:29 编程山人 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 对于 MBR,我们可以指定不同的激活模式。 服务器激活(Server-Activated Objects / SAO):只有在客户端调用代理对象第一个方法时才创建,区分为 Singleton 和 SingleCall 两种模式。Singleton 一如设计模式中的名称,无论有多少客户端都只有一个实例存在;而 SingleCall 则为每次调用创建一个新对象,因此它是无状态的。SingleCall 在方法调用完成后立即失效,不会参与生存期租约系统。 客户端激活(Client-Activated Objects / CAO):在客户端调用 new 或 Activator.CreateInstance 时立即创建。 通常情况下服务器激活模式只能使用默认构造函数,客户端激活模式则没有此限制。当然,可以通过其他方法来绕开这个限制,比如动态发布,我们会在后面的章节解决这个问题。 在 Remoting 中,我们使用 RemotingConfiguration 类型来完成远程类型的注册。RegisterWellKnownServiceType()、Regist 阅读全文
posted @ 2007-06-05 09:28 编程山人 阅读(464) 评论(0) 推荐(0) 编辑
摘要: Remoting 采取了一种称之为 "租约" 的机制来管理远程对象(Singleton、CAO)的生存期策略。每个应用程序域中都有一个租约管理器(LifetimeServices),它负责管理所有参与生存期的远程对象租约。租约管理器定期检查所有租约以确定过期的租约时间,如果租约已过期,将向该对象发起人(Sponsor)的发送请求,查询是否有谁要续订租约,若没有任何发起人续订该租约,租约将被移除,该远程对象也会被删除等待垃圾回收器回收。如果远程对象被发起人多次续订租约或被客户端持续调用,其生存期可以比其生存期租约长得多。 所谓发起人 (Sponsor,MSDN 翻译为"主办方",真别扭!) 就是一个或多个与远程对象关联,用于定义租约延长时间的对象。租约管理器通过回调发起人方法(ISponsor.Renewal)来查询是否续订租约。发起人需要继承自 MarshalByRefObject,且必须实现 ISponsor 接口。在 System.Runtime.Remoting.Lifetime 名字空间中,Framework 为我们提供了一个缺省实现 —— ClientSpo 阅读全文
posted @ 2007-06-05 09:27 编程山人 阅读(456) 评论(0) 推荐(0) 编辑
摘要: 信道(Channel)是 Remoting 体系的承载平台,负责处理客户端和服务器之间的通讯,其内容包括跨域通讯、消息传递、对象编码等等。信道必须实现 IChannel 接口,根据通讯方向又分别提供了继承版本 IChannelReceiver 和 IChannelSender。Remoting 框架为我们提供了 IPC、TCP 以及 HTTP 的实现版本,当然我们还可以在网络上找到其他协议的实现版本。 阅读全文
posted @ 2007-06-05 09:26 编程山人 阅读(512) 评论(0) 推荐(0) 编辑
摘要: Remoting 的异步调用和单个应用程序域异步编程基本相同。 阅读全文
posted @ 2007-06-05 09:24 编程山人 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 调用上下文(CallContext)提供了用于存储属性集的数据槽,可以让我们在调用服务器方法时将一些额外数据一并传送过去。当然,这些额外数据有点限制,就是必须要实现 ILogicalThreadAffinative 接口。调用上下文在应用程序域边界被克隆,其数据槽不在其他逻辑线程上的调用上下文之间共享。 阅读全文
posted @ 2007-06-05 09:19 编程山人 阅读(333) 评论(0) 推荐(1) 编辑
摘要: .NET Remoting 基础结构需要正确的元数据,以便将一个应用程序域中的对象连接到另一个域中的对象。通常我们将包含远程类型的程序集同时发布到服务器和客户端,但这并不是一个好主意。有太多的原因阻止我们这么做: 1. 我们并不想客户端开发人员知道远程对象的内部细节,诸如私有成员内容等。 2. 我们不希望每次升级都更新客户端文件。 阅读全文
posted @ 2007-06-05 09:16 编程山人 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 使用动态发布有什么好处? 1. 避开 SAO 只能使用默认构造方法的限制。 2. 自主管理 SAO 的载入、卸载,以及其 URI。 RemotingServices 通过使用类 RemotingServices 提供的方法,我们可以很轻松实现这些目标。 Marshal: 用于将 MarshalByRefObject 转换为 ObjRef 类的实例。 Connect:客户端可以用该方法创建远程代理对象的实例。 Disconnect:断开服务器远程对象与信道的连接。客户端代理在断开后调用任何方法都会触发 RemotingException。 Unmarshal:接受 ObjRef 并从它创建一个客户端代理对象。这个方法很少被使用,因为多数情况下我们并不会直接将 ObjRef 显示传递给客户端,而是交由 Remoting 基础结构来处理。 ObjRef ObjRef 是远程对象的可序列化表示,用于跨应用程序域边界传输对象引用。为对象创建 ObjRef 称为封送。可以通过信道 阅读全文
posted @ 2007-06-05 09:12 编程山人 阅读(357) 评论(0) 推荐(0) 编辑
摘要: .NET Remoting 的追踪服务使我们可以获取由远程结构发出的有关对象与代理的行为通知。追踪服务是可插入的,我们可以将一个或多个自定义跟踪处理程序注册到追踪服务中,当发生封送、取消封送或断开当前 AppDomain 中的对象或代理时,注册到中的每个追踪处理程序都将被远程处理调用。 阅读全文
posted @ 2007-06-05 09:11 编程山人 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 在 Remoting 中使用 Event 主要是为了实现 CallBack 机制,让服务器在接收到某个 "消息" 时,主动调用某个或多个客户端的方法。 阅读全文
posted @ 2007-06-05 09:10 编程山人 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 使用配置文件替代硬编码可使应用程序拥有更高的灵活性,尤其是对分布式系统而言,意味着我们可以非常方便地调整分布对象的配置。Remoting 的配置文件比较简单,详细信息可以参考 MSDN。 阅读全文
posted @ 2007-06-05 09:09 编程山人 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 封装SQLDMO操作的类,能完成常用的SQL Server 2000管理工作。 使用前请添加 "Microsoft SQLDMO Object Library" COM 引用。 有部分代码借鉴网络资料,再次向原作者表示感谢。 阅读全文
posted @ 2007-06-05 08:56 编程山人 阅读(535) 评论(0) 推荐(0) 编辑