关于Remoting(续)

Simulink仿真模块 - Signal Conversion 目录 说明 实例 创建总线信号的连续副本 ​将虚拟总线转换为非虚拟总线​ 将非虚拟总线转换为虚拟总线 将Muxed信号转换为矢量 模块特性 Signal Conversion:将信号转换为新类型,而不改变信号值 在仿真库中的位置为: Simulink / Signal Attributes HDL Coder / Signal Attributes 模型为: 说明 Signal Conversion模块可将信号从一种类型转换为另一种类型。要选择要... 阅读详情

昨天写了文章《关于Remoting》,感觉有些问题没有说清楚。后来又看了一些文档和书,整理了一下,就算是续吧。

其实我发现主要的问题还是集中在客户端激活模式。我想再谈谈客户端激活模式和服务器端激活模式两者在代码实现上的区别。这两种模式在服务器监听程序上的区别不大,前面那篇文章已经说得很清楚了,主要还是客户端程序。为了让概念不至于模糊混淆,我下面提到客户端激活模式,用Activated;服务器激活模式,用WellKnown。

先从VS提供的方法来看:

WellKnown模式:Activator.GetObject()方法。它的返回值是方法参数里指定类型的对象实例。

ServerRemoteObject.IServerObject serverObj = (ServerRemoteObject.IServerObject)
                Activator.GetObject(
                
typeof(ServerRemoteObject.IServerObject),
                
"tcp://localhost:8080/ServiceMessage");


Activated模式:
有两种方法:
1、静态方法:RemotingConfiguration.RegisterActivatedClientType()。这个方法返回值为Void,它只是将远程对象注册在客户端而已。具体的实例化还需要调用对象类的构造函数。

 RemotingConfiguration.RegisterActivatedClientType(                
                
typeof(ServerRemoteObject.ServerObject),
                
"tcp://localhost:8080/ServiceMessage");
            ServerRemoteObject.ServerObject serverObj 
= new ServerRemoteObject.ServerObject();


2、Activator.CreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的GetObject()不同的是,它要在客户端调用构造函数,而GetObject()只是获得对象,而创建实例是在服务器端完成的。CreateInstance()方法有很多个重载,我着重说一下其中常用的两个。
1) public static object CreateInstance(Type type, object[] args, object[] activationAttributes);
参数说明:
type:要创建的对象的类型。
args :与要调用构造函数的参数数量、顺序和类型匹配的参数数组。如果 args 为空数组或空引用(Visual Basic 中为 Nothing),则调用不带任何参数的构造函数(默认构造函数)。
activationAttributes :包含一个或多个可以参与激活的属性的数组。

这里的参数args是一个object[]数组类型。它可以传递要创建对象的构造函数中的参数。从这里其实可以得到一个结论:WellKnown激活模式所传递的远程对象类,只能使用默认的构造函数;而Activated模式则可以用户自定义构造函数。

activationAttributes参数在这个方法中通常用来传递服务器的url。
假设我们的远程对象类ServerObject有个构造函数:

            ServerObject(string pName,string pSex,int pAge)
            
{
                name 
= pName;
                sex 
= pSex;
                age 
= pAge;
            }

那么实现的代码是:

            object[] attrs = {new UrlAttribute("tcp://localhost:8080/ServiceMessage")};
            
object[] objs = new object[3];
            objs[
0] = "wayfarer";
            objs[
1] = "male";
            objs[
2] = 28;
            ServerRemoteObject.ServerObject 
= Activator.CreateInstance(
                
typeof(ServerRemoteObject.ServerObject),
                objs,attrs);

可以看到,objs[]数组传递的就是构造函数的参数。

2、public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);

参数说明:
assemblyName
将在其中查找名为 typeName 的类型的程序集的名称。如果 assemblyName 为空引用(Visual Basic 中为 Nothing),则搜索正在执行的程序集。
typeName
首选类型的名称。
activationAttributes
包含一个或多个可以参与激活的属性的数组。

参数说明一目了然。注意这个方法返回值为ObjectHandle类型,因此代码与前不同::

            object[] attrs = {new UrlAttribute("tcp://localhost:8080/EchoMessage")};            
            ObjectHandle handle 
= Activator.CreateInstance("ServerRemoteObject","ServerRemoteObject.ServerObject",attrs);
            ServerRemoteObject.ServerObject obj 
= (ServerRemoteObject.ServerObject)handle.Unwrap();

那么,这个方法实际上是调用的默认构造函数。ObjectHandle.Unwrap()方法是返回被包装的对象。

说明:要使用UrlAttribute,还需要在命名空间中添加:using System.Runtime.Remoting.Activation;

通过这些代码的比较,我们还可以得到一个不幸的结论:

对于Activated激活模式,不管是使用静态方法,还是使用CreateInstance()方法,都必须在客户端调用构造函数实例化对象。这样一来,在客户端我们提供的远程对象,就不可能只提供接口,而没有类的实现。而在WellKnown模式,因为在客户端只是用GetObject()获得对象,实例化是在服务器端完成的。所以客户端我们只提供接口就够了。

所以对于Activated模式,我们必须在服务器和客户端提供两份完全相同的远程对象Dll,这个结果确实让人很沮丧。有没有其他方法实现呢?鉴于它的实现原理,答案显然是否定的。我看了MSDN上的文章,唯一的可行方案就是利用前文提到的用工厂的方法。要注意的是:这种方法是一种利用WellKnown模式来模拟Activated模式,是一种方法的折中。

前文说过,服务器端远程对象,提供两个接口。一个接口是具体要传递的远程对象的接口,一个就是工厂接口。还必须有个工厂类实现工厂接口,提供创建远程对象实例的方法。

    public interface IServerObject
    
{
        Person GetPersonInfo(
string name,string sex,int age);
    }


    
public interface IServerObjFactory
    
{
        IServerObject CreateInstance();        
    }


    
public class ServerObject:MarshalByRefObject,IServerObject
    
{
        
public Person GetPersonInfo(string name,string sex,int age)
        
{
            Person person 
= new Person();
            person.Name 
= name;
            person.Sex 
= sex;
            person.Age 
= age;
            
return person;
        }
        
    }


    
public class ServerObjFactory:MarshalByRefObject,IServerObjFactory
    
{
        
public IServerObject CreateInstance()
        
{
            
return new ServerObject();
        }

    }

而客户端呢,只提供接口就可以了。

    public interface IServerObject
    
{
        Person GetPersonInfo(
string name,string sex,int age);
    }


    
public interface IServerObjFactory
    
{
        IServerObject CreateInstance();        
    }
 

然后我们用WellKnown激活模式,在服务器端:

//传递对象;
            RemotingConfiguration.RegisterWellKnownServiceType(
                
typeof(ServerRemoteObject.ServerObjFactory),
                
"ServiceMessage",WellKnownObjectMode.SingleCall);

注意这里注册的不是ServerObject类对象,而是ServerObjFactory类对象。

客户端:

ServerRemoteObject.IServerObjFactory serverFactory = (ServerRemoteObject.IServerObjFactory)
                Activator.GetObject(
                
typeof(ServerRemoteObject.IServerObjFactory),
                
"tcp://localhost:8080/ServiceMessage");

ServerRemoteObject.IServerObject serverObj 
= serverFactory.CreateInstance();

首先用GetObject()返回工厂接口,再利用该接口对象调用工厂的方法CreateInstance()来创建IServerObject对象。

也许有人会纳闷了,这里使用的是WellKnown模式啊,为什么说是Activated模式呢?是这样的,本质来说,它是WellKnown模式。但由于我们利用了工厂来创建实例,因此感觉上是在客户端来创建具体的远程对象实例。因此,我说这是一种方法的折中。

好了,写到这里,自认为交待清楚了。但Remoting的实现远不止于此,还有很多高级复杂的东西我们还没有用到。例如自定义通道,自定义MarshalByReferenceObject派生类,生命周期管理,自定义代理。这些东西我也弄不清楚。如果以后弄明白了,希望能写点东西。

 

Palantir 凭什么两年涨 20 倍?深度解析解决 AI 幻觉的 “本体论“ 核心原理 本文深度解析了Palantir本体(Ontology)的核心原理及其在企业AI应用中的革命性价值。本体通过构建结构化的语义层与动态执行层,将企业分散的数字资产(数据集、虚拟表、模型)映射为现实世界的数字孪生,使大模型能够在**严格的业务规则与数据边界内**进行推理与决策,从而从架构层面彻底解决AI幻觉问题。这一技术架构不仅帮助Palantir实现股价两年增长20倍、市值突破4000亿美金的商业成功,更成为SAP、Salesforce等ERP巨头争相模仿的下一代企业智能标准范式。通过航空业飞机故障应急处理等实 阅读详情

相关推荐

深入解析Incapsula reese84的生成机制与绕过策略

本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。

weixin_29256771的博客 443

初步接触remoting

刚接触remoting,看着网上的例子,写了一个示例,记录步骤: 1.创建一个PersonManager类库,里面是我们要对对象的操作方法,这里就不写啦。。。 2. 创建服务器端: /// //建立服务传输方式,可选择TCP或者HTTP,前者更能发挥高效性 TcpServerChannel tcp = new TcpServerChannel(8089);

热爱生活的专栏 711

Ubuntu开发环境配置——持续更新

本文简要介绍了Ubuntu下的开发环境配置流程和问题分析与解决,更多内容持续更新中。

m0_53365889的博客 2225

C# 反射之Activator用法举例

概述 程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作。Activator用法介绍Activator用于实例化对象的类,通过type获取类型后,可以通过它实例化对象.Activator.CreateInstance默认调用无参构造函数。实例:先定义一个学...

dotNET跨平台 1905

深入浅出:.sh文件在Linux系统中的实战应用与技巧

本文深入浅出地介绍了.sh文件在Linux系统中的实战应用与技巧。从基础概念入手,详细讲解了Bash脚本的运行方法、权限管理,并通过编写自动化备份脚本等实例,展示了如何利用Shell脚本提升工作效率。文章还涵盖了脚本调试、错误处理以及函数、参数解析等进阶技巧,帮助读者从入门到精通,掌握这一强大的自动化工具。

weixin_29243279的博客 352

2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛A题 农业灌溉系统优化

该摘要探讨了农业灌溉系统优化面临的复杂挑战,涉及智能灌溉技术的应用与资源配置问题。研究聚焦于一个1公顷的方形农场案例,该农场种植三种作物并面临动态环境条件(土壤类型、气象变化)。系统优化需平衡河流引水(非线性成本函数:C=50L^1.2+0.1Q^1.5)与储水罐灌溉(成本5元/升容积)两种方案,同时满足喷灌技术约束(喷头间距≥15米,覆盖半径15米)。关键矛盾体现在"平河旱储"的水资源调配策略与多作物需水量差异之间的协调,需通过传感器数据实时调整灌溉方案以实现效率最大化。(149字)

m0_60472361的博客 642

分布式数据库系统---商旅预定系统的实现(3)

通信信道的建立过程 1.注册通道 Remoting技术的通信建立分为两种:服务器端激活和客户端激活。本次设计采用的是服务器端激活模式。        在信道的建立过程中,需要在服务器端和客户端分别进行处理。 服务器端处理如下: 要跨越应用程序域进行通信,必须实现通道。如前所述,Remoting提供了IChannel接口,分别包含TcpChannel和HttpChannel两种类型的通道。

Skylvzhoulihe的专栏 1579

《QGIS快速入门与应用基础》239:指北针样式选择(预设/自定义)

系统解析指北针设计的核心规范与实操方法。文章首先强调行业规范红线,包括强制要求N字标注、箭头辨识度等关键要素,通过正误示例对比强化合规意识。其次详细讲解QGIS内置预设样式的分类应用,提供极简箭头、标准三角箭头等4类样式的选型对照表,并配图说明适用场景。最后介绍从基础微调到SVG导入的进阶自定义方法,帮助用户实现从合规到专业的样式设计。全文贯穿"合规优先、可读为本、美观为辅"原则,配有详细操作截图与规范对照表,适合从GIS新手到专业制图人员参考。

LuckyHanMo的博客 532

Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇

我写的.Net Remoting系列专题: Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务 Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触 Microsoft .Net Remoting系列专题之一 一、Remoting基础 什么是Remoting,简而言之,我们可以将其看...

weixin_34200628的博客 417

Dify平台隐患url:/console/api/remote-files/upload暴露高危漏洞,配置nginx htpasswd模块认证机制屏蔽解决

内部网络探测: 攻击者可通过SSRF扫描内网服务云元数据访问: 可能访问AWS/Aliyun/腾讯云等元数据服务服务端请求伪造: 以服务器身份发起任意HTTP请求。

CN_Eden 1322

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

算法大师! 1153

Remoting事件机制续

(1)关闭一个客户端以后会影响其他的客户端事件原因:客户端没有取消事件订阅就关闭了,触发事件的时候找不到事件订阅者解决:遍历委托链,找到异常的对象,从委托链中卸下(2)服务器端对客户端广播,客户端能收到其他客户端的事件处理信息原因:使用了Singleton模式,共享远程对象解决:因为需要远程对象有状态且不共享实例,所以只有客户端激活可以选择修改后的服务端:using System; usi

Xaero的专栏 870

JMeter压力测试全攻略:从入门到精通

本文系统讲解JMeter压力测试的完整流程与结果评估方法。开篇介绍压力测试的核心概念及JMeter工具特性,随后从环境搭建入手,详细说明JDK配置、JMeter安装及中文界面设置。主体部分围绕测试流程展开,涵盖测试计划创建、线程组参数调优、HTTP请求配置、断言与监听器添加等实操步骤;结果评估环节深入解析聚合报告指标、结果树分析及性能瓶颈定位方法,并通过电商接口测试案例演示全流程应用。文末总结关键要点,为读者提供从基础操作到分布式压测、性能调优的进阶学习方向,助力掌握JMeter在系统性能评估中的核心应用。

邓邓子的博客 2416

在Dubbo中开发REST风格的远程调用(RESTful Remoting)《续》

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33728268的博客 150

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# Remoting(RPC调用)

REMOTING是.NET自带的一种RPC调用方式。主要解决多个进程间互相的调用。 举例1:如现某一台电脑存在2个进程,进程1上存在一个按钮,点击按钮时会使进程2触发某个方法进行逻辑运算,那么我们存在的问题点在于如何让进程1联通进程2,同时让进程2自己去触发自己的某个方法。 举例2:如某一台电脑存在2个进程,2个进程现在都有可能修改某一个LIST,可以同时向这一个LIST中添加值或...

·穆·的博客 3173

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Remoting技术

Remoting技术简介 一 Remoting技术出现的背景1)分布式应用需求的迅速增长(Peer-to-Peer, Grid等技术的出现)2)原有的C/S, B/S模式和技术已经不能胜任(串口RS232,Socket,RPC,DCOM技术各有缺点)二 什么是Romoting?采用分布式进行编程的一种技术,Remoting主要用于管理跨应用程序域的同步和异步RPC 会话。在默认情况

twindly.lee 2008

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

关于Remoting

这几天看了不少Remoting文章。明白了不少技术细节,但困惑也不少。简单说来,Remoting是一个分布式处理服务。服务器端首先创建通道(Channel),并自动开启监听通道。根据客户端发出的请求,传递远程对象。因此,编写Remoting程序,主要分为三部分:1、被传递的远程对象;2、服务器端监听程序;3、客户端请求和处理对象程序;一、被传递的远程对象在Remoting中,被传递的远程对象类是有

他山之石,可以攻玉 2411

使用Remoting技术

         在Wifi网络环境下,我们常用WebService作为服务程序构建分布式的应用程序系统,但是现在越来越多的应用在GPRS网络,因此WebService访问性能的问题渐渐体现出来.为了解决GPRS网络下快速构建分布式应用系统的问题,必须找到一种访问效率高于WebService,且开发效率高于直接采用Socket的方式.基于以上原因,我们尝试采用Remoting技术作为服务程序提供服

不迎不送,来去自便,无茶无酒,谈笑随缘 1482

webservice与remoting

 从体系结构上说webservice有5个层次:  1. Http传输信道   2. XML的数据格式   3. SOAP封装格式   4. WSDL的描述方式   5. UDDI  从传输方式上:Web  Service和remoting传输协议不一样  。 Web  Service是http方式,可以穿透防火墙  。remoting是通过socket方式传输数据 。从运行原理上:  1

anshen的专栏 389

.Net Remoting 入门

关于.Net Remoting的一点总结AA)Remoting和WebService都是.Net提供的远程访问的方法,Remoting具有以下几个优点1、Tcp通道的Remoting速度非常快2、虽然是远程的,但是非常接近于本地调用对象3、可以做到保持对象的状态4、没有应用程序限制,可以是控制台,winform,iis,windows服务承载远程对象缺点:1、不是标准的应用,因此有平台限制

doubleyou的专栏 6460

Remoting原理及实现

.NET Remoting是.NET平台上允许存在于不同应用程序域中的对象相互知晓对方并进行通讯的基础设施。调用对象被称为客户端,而被调用对象则被称为服务器或者服务器对象。简而言之,它就是.NET平台上实现分布式对象系统的框架。 传统的方法调用是通过栈实现,调用方法前将this指针以及方法参数压入线程栈中,线程执行方法时将栈中的参数取出作为本地变量,经过一番计算后,将方法的返回结果压入栈中。这样

u012648365的专栏 4668

C# Remoting理解

问题:命名空间“System.Runtime.Remoting.Channels”中不存在类型或命名空间名“Tcp”(是否缺少程序集引用?) 解决:项目->添加引用->程序集->选中System.Runtime.Remoting

乌里随记的博客 1576
上一篇: .NET Remoting 体系结构评估
johnsonTj
博客等级 码龄23年 26粉丝 118原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值