.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 ...
随机推荐
- abp允许跨域代码,时间转换为固定格式,本地时间
在Global的 Application_BeginRequest方法中: Thread.CurrentThread.CurrentCulture = new CultureInfo("z ...
- 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)
BeanFactory和ApplicationContext Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类. Spring提供了两种不同的容器: 一种是最基本的Bean ...
- Date 类 02
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...
- iOS原生和H5的相互调用
为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代 ...
- RGB与HSV之间的转换公式及颜色表
RGB & HSV 英文全称 RGB - Red, Green, Blue HSV - Hue, Saturation, Value HSV --> RGB 转换公式 HSV --> ...
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...
- 用Postman做自动化测试的功能
自动化测试应该在桌面应用有该功能,在chrome的插件不知道有没有,我也没装chrome版的Postman Postman工具介绍图 上面这张就是Postman的操作界面.一开始我就是这样做简单的数据 ...
- 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- angularjs1.6.4中使用ng-table出现data.slice is not a function的问题
这个问题困扰了我2个小时. 项目中angularjs的版本从1.4.8升级到1.6.4,升级完成之后,发现ng-table不能用了.主要报错信息是ng-table中data.slice is not ...
- cookie、session和java过滤器
基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一 ...