2010-02-24 1 views
2

Я использую файлы конфигурации на стороне клиента для клиента .NET Remoting, и вызов.NET Remoting клиент конфигурации создает локальный объект, не удаленный

RemotingConfiguration.Configure() 

успешно завершается. Я ссылаюсь на библиотеку, где удаленные объекты определены в моем клиенте.

Проблема, с которой я столкнулась, заключается в том, что после настройки, когда я пытаюсь создать удаленный объект с помощью new(), он просто создает локальный объект из указанной DLL. Что я делаю не так?

Спасибо,

+0

не имеют ответа, но вы управляете вешать на goingto WCF вместо этого на .NET Remoting? – sebagomez

ответ

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

Привет, Удаленный объект, который я вызываю, расширяет MarshalByRefObject. Однако, когда я делаю RemotingConfiguration.Configure ("file.config"); MyRemoteObject x = new MyRemoteObject(); Все, что я получаю, это локальный объект, который построен на локальной машине. Еще раз благодарю вас, – azarias

+0

@aza tobsen's ya на этом. – Will

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, чтобы узнать отличия между объектами Client и Server Activated и между экземплярами singlecall и singleton.

+0

проблема заключается в использовании «нормального» стиля new(), а не конструкции Activator.GetObject. Еще раз спасибо. – azarias

+0

(И для этого используется файл конфигурации на стороне клиента). – azarias

+0

Если вы используете новый yourConcreteClass(); структура удаленного доступа не имеет возможности перехватить это и не имеет возможности предоставить объект remoteproxy. Если вы хотите, чтобы ваше клиентское приложение не осознавало удаленную инфраструктуру, вы должны либо использовать фабрику, которая инкапсулирует создание удаленных объектов, либо вы можете взглянуть на поддержку remoting в Spring.net (например, Spring.Remoting.SaoExporter, http://www.springframework.net/doc-latest/reference/html/remoting.html#remoting-publishsao). – tobsen

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