如何对远程对象进行本地访问

babysloth 2004-02-02 02:13:39
通过RemotingServices.Marshal可以为一个对象注册一个URI,
供远程或者跨AppDomain通过代理对象访问。有没有办法根据
URI进行本地访问呢(不通过代理对象,不进行参数Marhsal)?
谢谢。
...全文
190 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
elite2018 2004-02-03
  • 打赏
  • 举报
回复
同意楼上, 关注!!
babysloth 2004-02-03
  • 打赏
  • 举报
回复
2 ajex
多谢。按那个意思,意味着代理和对象实现都在本地时,即使使用远程访问,也不会进行serialization产生requestMessage?这个得验证一下。
jimmyzhang 2004-02-03
  • 打赏
  • 举报
回复
remoting的目的就是访问远程对象.
如果在本机上,直接用本地啊,这样性能可能會好一些
即使达到了不serialization,我觉得意义也不大.

別可以到ms社區里面找找看,應有這方面回答的,
噯卟釋手 2004-02-03
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~`
googman 2004-02-03
  • 打赏
  • 举报
回复
接上

persist其实就是远程对象,但在这里我们丝毫感觉不到他是,
因为得到它的方法是bcHome.GetBSO("DomainX.BusinessComponents.ShippersBSO");
那么bcHome又是什么呢?它其实也是一个远程对象,只不过它提供了对其他应用级的远程
对象的统一管理的功能。

当然这里所写的紧紧是客户端代码而已,对于这个模型,还需要服务端的部署,
和服务端应用程序的支持。
googman 2004-02-03
  • 打赏
  • 举报
回复
在我给公司搭建的与领域无关的企业应用开发核心程序里
对于remoting我就做到了远程对象的位置透明性,
即把远程对象做本地化调用,减轻了普通程序员(可能不清楚.net原理)在
理解remoting机制上觉得困难的问题。

请看一下调用代码:

BusinessComponentsRuntimeHome bcHome=new BusinessComponentsRuntimeHome();

IPersist persist=(IPersist)bcHome.GetBSO("DomainX.BusinessComponents.ShippersBSO");

if (persist!=null)
persist.Save(this.shippers);
lyhold 2004-02-03
  • 打赏
  • 举报
回复
关注!!
turnmissile 2004-02-03
  • 打赏
  • 举报
回复
Remoting的作用就是产生一个远程调用的借口,所有remote object上的调用都可以直接写成本地调用的方式_RO.SomeCall().但是事实上这些操作的具体位置是在远端上的,本地只是对这个remote object上一个函数的调用。如果这个调用被实现为同步的,则会等到该远程调用结束,然后接受返回值,如果这个调用是不同步的,则直接返回。
至于在没有code的情况下,希望通过remoting实现本地调用,似乎是不可能的。
我做过测试,即使你拥有远端对象的dll,而不是仅仅有一个interface,你还是不能实现本地调用,除非你在本地重新new一个新的object,调用这个object的method.这样做似乎比较麻烦,但肯定是可行的。


babysloth 2004-02-03
  • 打赏
  • 举报
回复
2 googman
您的意思是自己在remoting的uri方式外面再包装一层,是吧?可行:-)只是想看看有没有比较简单的方式。不过这样也足够了。多谢!
moznan 2004-02-03
  • 打赏
  • 举报
回复
使用remoting,在局域网内,使用TCP协议,访问本机和局域网内其他机器是一样的,对象不需要序列化
peng_dw 2004-02-03
  • 打赏
  • 举报
回复
在wrox的红宝书中介绍过两种办法:一种是在iis中设置时,选中目录浏览,在客户端就可以通过uri访问,但是我试过了,好象不行;
另一种办法是在服务器端将文件转换成流,传送到客户端内存中运行。
1979xt 2004-02-02
  • 打赏
  • 举报
回复
学习
ajex 2004-02-02
  • 打赏
  • 举报
回复
哪种方式active,只是对远程对象的实例的生存周期不同,而非serialization的不同.
elite2018 2004-02-02
  • 打赏
  • 举报
回复
In Remoting , client-actived Techique is likely to match your Demand
ajex 2004-02-02
  • 打赏
  • 举报
回复
在MS的网站上找到:

通过从 MarshalByRefObject 导出对象,您可以使任一对象变为远程对象。当某个客户端激活一个远程对象时,它将接收到该远程对象的代理。对该代理的所有操作都被适当地重新定向,使远程处理基础结构能够正确截取和转发调用。尽管这种重新定向对性能有一些影响,但 JIT 编译器和执行引擎 (EE) 已经优化,可以在代理和远程对象驻留在同一个应用程序域中时,防止不必要的性能损失。如果代理和远程对象不在同一个应用程序域中,则堆栈中的所有方法调用参数会被转换为消息并被传输到远程应用程序域,这些消息将在该远程应用程序域中被转换为原来的堆栈帧,同时该方法调用也会被调用。从方法调用中返回结果时也使用同一过程。

在代理和远程对象驻留在同一个应用程序域中时,MS已经作了优化,是不是说可以不经过serialization?
babysloth 2004-02-02
  • 打赏
  • 举报
回复
2 ajex
不是需要new一个呀,而是已经new出来了,维护着若干的状态,需要随时通过URI来获取这个对象
速马 2004-02-02
  • 打赏
  • 举报
回复
还是不明白楼主的意图...
COM,COM+的管理也很方便啊
ajex 2004-02-02
  • 打赏
  • 举报
回复
实在不行就自定义一个类,判断url是不是本地,如果是本地就直接new一个,如果不是Activator.GetObject(......).

呵呵.
babysloth 2004-02-02
  • 打赏
  • 举报
回复
因为要做到组件的位置透明管理呀,呵呵。管理组件的时候,希望统一地通过一个URI来管理组件,而这些组件有的在本机,有的在远程。在本地的组件,有时候希望能在同一appdomain中访问,获得高效率。
ajex 2004-02-02
  • 打赏
  • 举报
回复
我觉得remoting的目的就是访问远程对象.
如果在本机上,干嘛不直接引用.直接用.何必用remoting呢,这样性能不是最好吗?
即使达到了不serialization,我觉得意义也不大.等待高手来解答.
加载更多回复(7)

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧