.NET简谈组件程序设计之(初识远程调用)
在.NET1.0版本出来的时候,要想进行远程调用基本上都是通过WebService的方式。而随着.NET2.0版本的出现,我们可以通过一个更加方便且高扩展性的框架来进行编写远程调用的程序,也就是我们都比较熟悉的.NetRemoting。
网上对.NetRemoting技术讲解的文章不计其数,但是很少有一本比较全面的、系统的学习书籍。我们都是从哪些零散的知识里慢慢摸索,效果不太理想。
今天我也来简单的介绍一下我理解的Remoting。不仔细研究一下还真不知道它的厉害,完全的托管平台、高扩展性、灵活性。框架完全采用面向接口编程,任何一个点我们都能提供自己的实现,信道、格式化器、租约、赞助方等等,系统都为我们预留了扩展的接口。[王清培版权所有,转载请给出署名]
在本人的“.NET简谈组件程序设计之(AppDomain应用程序域) ”一章中我简单的介绍了.NET托管运行时环境应用程序域(AppDomain)的概念。任何跨越应用程序域的访问.NET都将它视为远程调用,不管是在同一个进程中的两个应用程序域,还是一台PC上的两个进程中的两个应用程序域,还是跨越网络的两个应用程序域,.NET都通过代理的方式进行调用。
其实在一个进程中的两个应用程序域交互相对而言是简单的。当我们在默认的应用程序域中创建一个新的AppDomain对象,只需要实例化一个AppDomian然后通过MarshalByRefObject的CreateRefObject方法创建一个ObjRef将其新的应用程序域的代理所需要的所有信息带到客户端应用程序域中来,因为AppDomain也是派生与MarshalByRefObject类。后续的操作都是通过代理进行调用的,所有在域中创建的对象都不可能跑出来,只能被按值封送或者按引用封送。
同一个进程中的两个应用程序域共享一个物理进行空间,而线程是路径的物理执行单位,在CPU执行的时候才不管你是啥域,直接穿越。所以如果我们在同一个进程中用线程来进行处理的话,无需关心应用程序域的概念,但是这样有很多潜在的威胁,比如上下文安全、组件服务等都是要严格控制调用链的,在组件服务中都是通过上下文拦截来进行服务的调用,所以不提倡用线程来穿越域。详情请查看.NET企业服务相关技术。[王清培版权所有,转载请给出署名]
然而如果是跨进程的或者跨网络的远程调用就没这么简单了,当然这个不简单我们无需担心,NET为我们做好了。我们试着分析一下,如果要远程调用该会涉及哪些技术,这样便于我们有自主学习的能动力。
我们设想一下,.NET托管对象都宿主在物理进程中的,要想不同进程之间的通讯操作系统为我们提供了IPC技术,要想不同网络之间的进程通讯操作系统为我们提供了Socket。那么如果一个进程中的应用程序域想调用另一个进程中的应用程序域的对象必须通过物理进程的承载才行,也就是涉及到了IPC的调用。如果一个网络中的一个进程中的应用程序域想调用另一个网络中的进程中的应用程序域中的对象,就得通过操作系统为我们提供的Socket技术。[任何高层的应用均是建立在底层基础之上的]
同一台机器之间的调用:
不同机器之间的调用:
上面两幅图基本上就是对象之间的调用过程。看起来确实比较复杂,但是.NET为我们做了个很好的统一的远程处理框架.NetRemoting,我们只需要简单的配置就能很方便的进程远程调用。[王清培版权所有,转载请给出署名]
这篇文章是.NetRemoting的一个开篇铺垫吧,没涉及到多少Remoting的技术,但是这篇文章里面所讲的内容正是Remoting实现的类型,只有清楚的理解了这些关系之后我们才能很好的运用Remoting。