.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。








 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/667077,如需转载请自行联系原作者



相关文章
|
7月前
|
前端开发 C# 数据库
.NET中使用BootstrapBlazor组件库Table实操篇
.NET中使用BootstrapBlazor组件库Table实操篇
171 0
|
7月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
|
2月前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
7月前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
111 0
|
5月前
|
存储 开发框架 前端开发
基于Lumisoft.NET组件,使用IMAP协议收取邮件
基于Lumisoft.NET组件,使用IMAP协议收取邮件
|
5月前
|
存储 对象存储 Python
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
|
6月前
|
NoSQL 大数据 Redis
分享5款.NET开源免费的Redis客户端组件库
分享5款.NET开源免费的Redis客户端组件库
103 1
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
44 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
66 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
50 0