2010-02-24 30 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