Конфигурация клиента .NET Remoting создает локальный объект, а не удаленный - PullRequest
2 голосов
/ 24 февраля 2010

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

RemotingConfiguration.Configure() 

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

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

Спасибо,

Ответы [ 3 ]

3 голосов
/ 24 февраля 2010

На сайте клиента нужно позвонить

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

1 голос
/ 19 июля 2010

В вашем файле конфигурации что-то не так. Скорее всего, ваша сборка неверна. Например, если ваш файл конфигурации выглядит так:

<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

0 голосов
/ 24 февраля 2010
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.");
...