【问题标题】:.NET Remoting client config creates local object, not remote.NET Remoting 客户端配置创建本地对象,而不是远程
【发布时间】:2010-02-24 17:48:28
【问题描述】:

我正在为 .NET 远程处理客户端使用客户端配置文件,而

RemotingConfiguration.Configure() 

调用成功完成。我已经引用了在我的客户端中定义远程对象的库。

我遇到的问题是,在配置之后,当我尝试使用 new() 创建一个远程对象时,它只是从引用的 DLL 创建一个本地对象。我做错了什么?

谢谢,

【问题讨论】:

  • 没有答案,但您是否管理过转到 WCF 而不是 .net 远程处理的可能性?

标签: c# .net remoting


【解决方案1】:

在您需要调用的客户端站点上

IYourRemoteObjectInterface remoteObj = 
(IYourRemoteObjectInterface)Activator.GetObject(typeof(IYourRemoteObjectInterface),
 "tcp://remotehost:1002/Test");

为了从配置如下的服务器检索远程代理对象:

<configuration>
 <system.runtime.remoting>
  <application name="server">
   <service>
    <activated type="remote.ServiceClass, serviceclassassembly"/>
   </service>
   <channels>
    <channel ref="tcp" port="1002">
     <serverProviders>
      <formatter ref="binary" typeFilterLevel="Full"/>
     </serverProviders>
     <clientProviders>
      <formatter ref="binary"/>
     </clientProviders>
    </channel>
   </channels>
  </application>
 </system.runtime.remoting>
</configuration>

也许您应该阅读一些关于 .net 远程处理的 tutorials,以了解客户端和服务器激活对象之间以及单调用和单例实例之间的区别。

【讨论】:

  • 问题在于使用“正常”风格的 new() 创建,而不是 Activator.GetObject 构造。再次感谢您。
  • (并使用客户端配置文件来实现)。
  • 如果你使用 new yourConcreteClass();远程处理框架没有机会拦截它,也无法提供远程代理对象。如果您想让您的客户端应用程序不知道远程处理基础设施,您应该使用封装远程处理对象创建的工厂,或者您可以查看 spring.net 的远程处理支持(例如 Spring.Remoting.SaoExporter,springframework.net/doc-latest/reference/html/… )。
  • 托布森的评论不正确。 azarias 尝试做的不仅是可能的,而且是推荐的创建 .NET 远程处理对象的方法。请参阅我的回答,了解他(可能)做错了什么。
  • 哎呀,我的最大过错!特别是我对“如果你使用 new yourConcreteClass(); 远程框架没有机会拦截这个并且无法提供远程代理对象”是错误的。 msdn 还说调用 activator.getinstance 和调用 new yourconcreteclass() 都可以(msdn.microsoft.com/en-us/library/w93betdk(v=VS.80).aspx)。再次抱歉! mhenty1384 和 azarias。但是,我希望您查看 spring.net 并将 Remoting 基础架构推到您架构的边缘;-)
【解决方案2】:

您的配置文件有问题。 很可能您的组装是错误的。例如,如果您的配置文件如下所示:

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown
          type="Foo.MyService, WRONGASSEMBLY"
          url="tcp://localhost:33000/MyServiceUri" />
      </client>
    </application>
  </system.runtime.remoting>
</configuration>

一切都将编译和运行,但您将使用对象的本地副本而不是远程副本。配置文件中的程序集应该是您的对象所在的程序集。因此,如果您将对象放在公共程序集中并引用它,那么公共程序集将是您想要的程序集。

如果您不想创建一个通用程序集,您甚至可以在两个项目中包含包含您的对象的源文件,但是,令人惊讶的是,您放入配置文件中的程序集将是您的CLIENT 程序集(不是服务器)。

换句话说,配置文件中提到的程序集告诉 .NET 代码中的哪些对象应该重定向到远程位置,而不是对象所在的位置(这就是“url”的用途)。 "namespace.typename, assembly" 完全描述了对象,因此远程处理可以将对象的新调用切换为进行代理。

这里有一些很好的例子: http://www.codeproject.com/KB/WCF/net_remoting.aspx

【讨论】:

    【解决方案3】:
    if(!typeof(MarshallByRefObject).IsAssignableFrom(typeof(MyRemoteObject))
      throw new InvalidOperationException(@"If a type doesn't extend MBRO, it is
      marshalled by value.  Make sure MyRemoteObject extends MBRO.");
    

    【讨论】:

    • 您好,我正在调用的远程对象扩展了 MarshalByRefObject。但是,当我做 RemotingConfiguration.Configure("file.config"); MyRemoteObject x = new MyRemoteObject();我得到的只是一个在本地机器上构建的本地对象。再次感谢您,
    • @aza tobsen 让你明白了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多