.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 ...
随机推荐
- 01. SELECT显示和PRINT打印超长的字符
从SQL Server 2005开始,引入了varchar(max) / nvarchar(max) 数据类型,表中可不使用LOB数据类型,从而突破单列8000 / 4000字符的限制,动态SQL也可 ...
- 初学node.js有感一
Node.js感悟 一.前言 很久以前就对node.js十分的好奇和感兴趣,因为种种原因没能去深入的认识了解和学习掌握这门技术,最近正好要做一些项目,其中就用到了node.js中的一些东西,所以借着使 ...
- C++学习,两个小的语法错误-network-programming
1.bool CServerSocket::initSocket(const char* ip=NULL,const UINT &port)://会出现默认参数为2的错误 解决方案: //C+ ...
- Jenkins系列——定时构建
1.环境说明 操作系统:win7旗舰版64bit jdk:sun JDK1.7.0_80 64bit tomcat:apache-tomcat-8.0.41 jenkins:2.32.3LST 本系列 ...
- linux下安装git提示”无法打开锁文件 /var/lib/dpkg/lock - open (13: 权限不够)“
如图所示,输入命令:apt-get install git后提示权限不够 解决方法,在命令前加 sudo即可 sudo apt-get install git sudo是linux系统管理指令,是允许 ...
- Java--JDBC连接数据库(二)
本篇文章接着上篇文章,还剩下一个知识点是,可滚动的结果接集和可更新的结果集.一般默认情况之下,多结果集是不可以显式滚动,移动选择的.如果想要做到,需要指定一些参数,那么本篇就接着介绍如何操作可滚动的结 ...
- sqlalchemy和flask-sqlalchemy几种分页操作
sqlalchemy中使用query查询,而flask-sqlalchemy中使用basequery查询,他们是子类与父类的关系 假设 page_index=1,page_size=10:所有分页查询 ...
- 我的Java设计模式-原型模式
"不好意思,我是卧底!哇哈哈哈~"额......自从写了上一篇的观察者模式,就一直沉浸在这个角色当中,无法自拨.昨晚在看<使徒行者2>,有一集说到啊炮仗哥印钞票,我去, ...
- java 集合框架(十)List
一.概述 List是一种有序集合,有时也被称为序列,可以有重复的元素.List集合相比Collection,除了直接继承的方法外,有以下拓展的操作方法 位置访问---可以基于元素索引来操作元素,比如g ...
- win7 vs2012+wdk8.0 搭建wdf驱动开发环境
开发环境搭建:系统:win7 x64工具:vs2012 + WDK8.0插件:wdfcoinstaller.msi(1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建wind ...