.Net Remoting使用总结
刚开始接触Remoting的时候,有点排斥,我都使用过webservice,wcf、以及rest。想一想,Remoting是不是过时了?由于公司前辈的缘故,公司的产品用的就是Remoting,那时候wcf出来,用的人估计不多,另外一方面,此处用Remoting还是很适合的,如果要改用wcf,未免感觉有点沉重。
关于Remoting的理论方面,的确好多文章都讲的是云里雾里。那么我们先看代码:
public interface IOfficeService
{
void Insert(Bibliography[] bibliographies); IntPtr GetActiveDocumentWindowHandle(); void Insert(string stream);
}
这是一个office插件提供的服务,核心是 Insert方法,实现word文档中插入题录的功能。
[Serializable]
public class OfficeServiceImplement : MarshalByRefObject , IOfficeService
{
public void Insert(Bibliography [] bibliographies)
{
OfficeServiceProxy.OnInsertReferences(bibliographies);
} public IntPtr GetActiveDocumentWindowHandle()
{
return OfficeServiceProxy.OnGetActiveDocumentWindowHandle();
} public void Insert(string stream)
{
OfficeServiceProxy.OnInsertReferencesStream(stream);
}
}
这是word插件提供的服务器对象模型,这个对象因为继承了MarshalByRefObject,所以它可以跨应用程序域边界被引用。定义好了服务器对象模型,然后看看remoting的通讯机制:
channel = new HttpServerChannel(CHANNEL_NAME, GetEnablePort(), Provider);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(OfficeServiceImplement), OBJECT_URI, WellKnownObjectMode.Singleton);
这两句代码,定义了服务器端的信道,而且公布了服务器端对象的地址,以及对象激活的方式。信道采用的是http,对象激活方式有两种:1、服务器端对象激活 2、客户端对象激活。此处采用服务器端对象激活中的singleton,我们可以理解为单例模式,也就是服务器端始终为一个对象,为客户端提供服务。 Provider是信息传输的方式,如二进制和xml传输。
public static SoapServerFormatterSinkProvider Provider = new SoapServerFormatterSinkProvider()
{
TypeFilterLevel = TypeFilterLevel.Full
};
显然程序中是采用soap格式,即xml方式传输。
public const string CHANNEL_NAME = "OfficeService";
public const string OBJECT_URI = "OfficeService.rem";
以上这些工作都是服务器端定义服务,注册信道,那么客户端是如何调用呢?
if (WordService == null)
{
WordService = Activator.GetObject(typeof(IOfficeService), string.Format(OfficeService.ServiceUrl, ShareDataRW.OfficeAddinServicesPort)) as IOfficeService;
} try
{
IntPtr window = WordService.GetActiveDocumentWindowHandle(); if (Win32APIs.IsIconic(window) != IntPtr.Zero)
{
Win32APIs.ShowWindow(window, Win32APIs.WindowState.SW_SHOWNOACTIVATE);
} Win32APIs.SetForegroundWindow(window);
}
这段代码是调用服务器端对象,获取word当前的活动窗口句柄,然后激活这个窗口。实现原理:通过指定服务地址,获取服务器对象的一个代理,所有的真实操作发生在服务器端,而客户端的这个代理是通过服务器对象序列化,发送到客户端生成的,在内存当中,对客户端来说是透明的,也就是说客户端不知道这个代理的存在。当客户端调用远程对象的一个方法时,这时候,代理会把请求参数,请求的方法等信息通过信道传送到服务器,服务器上的对象会执行相关方法,返回执行结果。
当然了remoting技术博大精深,我总结了下,把我的理解记录下来。
.Net Remoting使用总结的更多相关文章
- spring remoting源码分析--Hessian分析
1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...
- Visual Studio 2013 Ultimate因为CodeLens功能导致Microsoft.Alm.Shared.Remoting.RemoteContainer.dll高CPU占用率的折中解决方案
1.为什么Microsoft.Alm.Shared.Remoting.RemoteContainer.dll的CPU占用率以及内存使用率会那么高? 在Visual Studio 2013 Ultima ...
- VS2015 出现 .NETSystem.Runtime.Remoting.RemotingException: TCP 错误
错误内容: 界面显示内容为: .NET�������������System.Runtime.Remoting.RemotingException: TCP 淇¢亾鍗忚鍐茬獊: 搴斾负鎶ュご銆� 鍦 ...
- .Net中Remoting通信机制简单实例
.Net中Remoting通信机制 前言: 本程序例子实现一个简单的Remoting通信案例 本程序采用语言:c# 编译工具:vs2013工程文件 编译环境:.net 4.0 程序模块: Test测试 ...
- .Net中Remoting通信机制
Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式. 从微软的产品角度 ...
- .NET Remoting 应用实例
前言 项目中运用到.NET Remoting ,前段时间也看了下.NET Remoting的相关资料,感觉自己应该动手写个实例来梳理下对.NET Remoting认识和理解,不足的地方请大家指正. 简 ...
- Holographic Remoting
看到微软官方的 Holographic Remoting Player https://developer.microsoft.com/en-us/windows/holographic/hologr ...
- IIS部署Remoting总结
1.在IIS里新建一个网站,命名为test,路径指向 e:\test: 2.在 e:\test下创建目录bin: 3.把Remoting远程对象的Project设置为类库,编译为DLL文件,然后复制到 ...
- .NET Remoting 体系结构 之 在 ASP.NET 中驻留远程服务器
迄今为止,所有服务器示例都是运行在自驻留(self-hosted)的.NET 服务器上.自驻留的服务器必 须手动启动..NET Remoting 服务器也可以在许多其他的应用程序类型中启动.在 Win ...
- Remoting and web services using Spring[摘自官网]
spring document url: http://docs.spring.io/spring/docs/ Using Hessian First we’ll have to create a n ...
随机推荐
- C# 托管堆和垃圾回收器GC
这里我们讨论的两个东西:托管堆和垃圾回收器,前者是负责创建对象并控制这些对象的生存周期,后者负责回收这些对象. 一.托管堆分配资源 CLR要求所有的对象都从托管堆分配.进程初始化时,CLR划出一个地址 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项
配置选项 在基于"less rope to hang yourself with"思想下,.NET 框架没有给开发提供很多太多的配置选项.但在大多数情况下,GC会跟你的硬件配置,及 ...
- ERROR namenode.NameNode: Failed to start namenode. java.lang.IllegalArgument
这个问题一般是配置文件配置没有配置好的原因
- js中boolean类型的理解
<html> <head> <script type="text/javascript"> var x="12"; aler ...
- Mac下VirtualBox共享文件夹设置
环境:CentOS7.2最小化安装 步骤: 先安装必要软件包 yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel ...
- B. Pyramid of Glasses
原题链接 B. Pyramid of Glasses Mary has just graduated from one well-known University and is now attendi ...
- CompletableFuture CompletableFuture.supplyAsync 异常处理
CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程 /** * User: laizhenwei * Date: 2018-01-30 Time ...
- Appium疑难杂症
坑之初体验 在Appium的初体验中,遇到了一些坑坑洼洼.将他们记录下来,以后方便查阅. 1. session大于60秒没接收到命令自动关闭 通过Appium-Python-Client连接到appi ...
- 搬砖的也能学Python----if - elif 语句
引入:如果平时执行的过程超过两个分支,则使用if-elif语句 if-elif 语句结构 if 判断条件: 要执行的代码 elif 判断条件: 要执行的代码 -- else: 要执行的代码 判断条件: ...
- 工业级GBDT算法︱微软开源 的LightGBM(R包正在开发....)
看完一篇介绍文章后,第一个直觉就是这算法已经配得上工业级属性.日前看到微软已经公开了这一算法,而且已经发开python版本,本人觉得等hadoop+Spark这些平台配齐之后,就可以大规模宣传啦~如果 ...