2010-02-24 48 views
2

我使用的客户端配置文件的.NET远程客户端,.NET远程客户端配置生成本地对象,而不是远程

RemotingConfiguration.Configure() 

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

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

谢谢

+0

没有答案,但你有没有管理上,而不是.NET远程打算去WCF的posibility? – sebagomez 2010-02-24 17:51:10

回答

0
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."); 
+0

嗨Will, 我在调用的远程对象扩展了MarshalByRefObject。但是,当我做 RemotingConfiguration.Configure(“file.config”); MyRemoteObject x = new MyRemoteObject(); 我所得到的是本地机器上构建的本地对象。 再次感谢你, – azarias 2010-02-24 18:01:46

+0

@aza tobsen的这一个得到了雅。 – Will 2010-02-24 18:03:10

3

在您需要致电

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> 

也许你应该阅读一些tutorials的.net远程处理,以了解差异客户端和服务器之间激活的对象之间以及单播和单例之间的实例。

+0

问题在于使用'normal'风格的new()创建,而不是Activator.GetObject构造。 再次感谢您。 – azarias 2010-02-24 18:05:45

+0

(并使用客户端配置文件来实现这一点)。 – azarias 2010-02-24 18:07:06

+0

如果您使用new yourConcreteClass();远程处理框架没有机会拦截此,并且无法提供远程代理对象。如果你想让你的客户端应用程序不知道远程处理基础设施,你应该使用一个封装远程对象创建的工厂,或者你可以看看spring.net的远程处理支持(例如Spring.Remoting.SaoExporter,http:///www.springframework.net/doc-latest/reference/html/remoting.html#remoting-publishsao)。 – tobsen 2010-02-24 18:54:30

1

你的配置文件有问题。 您的装配很可能是错误的。例如,如果你的配置文件看起来是这样的:

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

一切都将编译和运行,但你会使用对象的本地副本,而不是远程复制的。配置文件中的程序集应该是对象所在的程序集。因此,如果将该对象置于常用程序集和引用中,则常用程序集将成为所需的程序集。

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

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

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