.Net Remoting.
От: Joker3D Россия http://blog.trunin.com
Дата: 26.05.02 11:09
Оценка:
Столкнулся я тут с проблемой:
Хочу создать удаленно объект. Вычитал что есть Server-activated и Client-activated объекты.
С Server-activated я вроде разобрался:
На сервере ServerApp делаю класс RemoteServer, реализующий опубликованный в общей сборке Common интерфейс IServer.
Пишу и потом юзаю конфиг:
ServerApp.exe.config:
<configuration>
<system.runtime.remoting>
<application name="ServerApp">
<service>
<wellknown mode="Singleton" type="ServerApp.RemoteServer, ServerApp" objectUri="RemoteServer.soap" />
</service>
<channels>
<channel ref="http" port="8000" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
На клиенте создаю объект так:
IServer myServ = ( IServer )Activator.GetObject( typeof( IServer ), "http://localhost:8000/ServerApp/RemoteServer.soap" );

Вопрос #1: КАК УКАЗАТЬ ЧТОБЫ УДАЛЕННО СТАЛ ЮЗАТЬСЯ ЗАРАНЕЕ СОЗДАННЫЙ НА СЕРВЕРЕ ОБЪЕКТ???

RemotingServices.Marshal( myServObj [,URI] ) почему то не работает,
вернее он просто генерит не тот URI который надо (надо "ServerApp/RemoteServer.soap" )и видимо поэтому для клиента создается новый объкт...


И еще, как бы сделать так чтобы создавались Client-activated объекты?
IServer myServ = ( IServer )Activator.CreateInstance( typeof( IServer ) ); не прокатывает... (видимо это просто аналог: IServer myServ = new IServer())
... даже если предварительно прописать и заюзать конфиг:

<configuration>
<system.runtime.remoting>
<application>

<client url="http://localhost:8000/ServerApp">
<wellknown type="Common.IServer, Common" url="http://localhost:8000/ServerApp/RemoteServer.soap" />
</client>

<channels>
<channel ref="http" />
</channels>

</application>
</system.runtime.remoting>
</configuration>

А во всех МСДН'овских примерах удаленно юзают класс, сборка которого полностью доступна на клиенте:
RemoteServer myServ = ( RemoteServer )Activator.CreateInstance( typeof( RemoteServer ) );
Это работает, но какой смысл в такой удаленной активизации если на клиенте есть полная имплементация всех методов???

Итак, вопрос #2: КАК УДАЛЕННО СОЗДАТЬ CLIENT-ACTIVATED ОБЪЕКТ ЕСЛИ НА КЛИЕНТЕ ДОСТУПНА ТОЛЬКО ИНФОРМАЦИЯ ОБ ИМПЛИМЕНТИРОВАННОМ В НЕМ ИНТЕРФЕЙСЕ?


Заранее огромное спасибо всем кто отзовется!
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re: .Net Remoting.
От: Unauthorized  
Дата: 27.05.02 02:27
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Вопрос #1: КАК УКАЗАТЬ ЧТОБЫ УДАЛЕННО СТАЛ ЮЗАТЬСЯ ЗАРАНЕЕ СОЗДАННЫЙ НА СЕРВЕРЕ ОБЪЕКТ???


Делаешь его Singleton и на сервере созщдаешь его же с помощбю GetObject:

static RemInterface.RemoteInterface cl;

TcpChannel chan = new TcpChannel( 8085 );
ChannelServices.RegisterChannel( chan );
RemotingConfiguration.RegisterWellKnownServiceType(
typeof( RemoteClass ),
"MyRemote", WellKnownObjectMode.Singleton );

cl = ( RemInterface.RemoteInterface )Activator.GetObject( typeof( RemInterface.RemoteInterface ), "tcp://mfc:8085/MyRemote" );
Re[2]: .Net Remoting.
От: Joker3D Россия http://blog.trunin.com
Дата: 27.05.02 03:03
Оценка:
Здравствуйте Unauthorized, Вы писали:

U>Здравствуйте Joker3D, Вы писали:


JD>>Вопрос #1: КАК УКАЗАТЬ ЧТОБЫ УДАЛЕННО СТАЛ ЮЗАТЬСЯ ЗАРАНЕЕ СОЗДАННЫЙ НА СЕРВЕРЕ ОБЪЕКТ???


U>Делаешь его Singleton и на сервере созщдаешь его же с помощбю GetObject:


U>static RemInterface.RemoteInterface cl;


U>TcpChannel chan = new TcpChannel( 8085 );

U>ChannelServices.RegisterChannel( chan );
U>RemotingConfiguration.RegisterWellKnownServiceType(
U> typeof( RemoteClass ),
U> "MyRemote", WellKnownObjectMode.Singleton );

U>cl = ( RemInterface.RemoteInterface )Activator.GetObject( typeof( RemInterface.RemoteInterface ), "tcp://mfc:8085/MyRemote" );


Спасибо, Михаил! Это конечно может решить проблему... но, все-таки, хотелось бы решить ее по-человечески, а не через соединение сервера с самим собой через сеть... хотя может быть тут Микрософт это дело и соптимизировала...

Тем более что мне это нужно для начальной инициализации объекта. Ну нужно бы ему указать хозяина который его создал:
RemoteServer myRemoteServer = new RemoteServer( this );
чтобы потом этот объект на все удаленные вызовы дергал хозяина...

т.о вопрос остается открытым...
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[3]: .Net Remoting.
От: Unauthorized  
Дата: 27.05.02 03:08
Оценка:
Здравствуйте Joker3D, Вы писали:

Короче при создании на сервере можно сразу получить ссылку на класс а не на интерфейс:


static RemoteClass cl;
cl = ( RemoteClass )Activator.GetObject( typeof( RemInterface.RemoteInterface ), "tcp://mfc:8000/RemoteURL" );

добавишь в класс необходимые методы и инициализируй что хочешь, все равно изврат, но по кранйне мере работает

П.С. Джо кинь мне пример работы Remoting с конфигурационными файлами, а то что-то у меня не получается ;(
Re: .Net Remoting.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.05.02 14:04
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Вопрос #1: КАК УКАЗАТЬ ЧТОБЫ УДАЛЕННО СТАЛ ЮЗАТЬСЯ ЗАРАНЕЕ СОЗДАННЫЙ НА СЕРВЕРЕ ОБЪЕКТ???

Зачем тебе заранее созданный? Well known singleton создается один на всех. Если тебе нужно чтобы он никогда не пересоздавался — перекрой InitializeLifetimeServices и верни из него null.
Впрочем можно и так как ты хочешь. Собственно рабочий объект делаешь синглтоном и ручками создаешь экземпляр, а публикуешь специальный класс-хелпер, единственная задача которого вернуть ссылку на рабочий класс.

JD>Итак, вопрос #2: КАК УДАЛЕННО СОЗДАТЬ CLIENT-ACTIVATED ОБЪЕКТ ЕСЛИ НА КЛИЕНТЕ ДОСТУПНА ТОЛЬКО ИНФОРМАЦИЯ ОБ ИМПЛИМЕНТИРОВАННОМ В НЕМ ИНТЕРФЕЙСЕ?

Ну во первых — если объект передается по значению это принципиально невозможно. Если по ссылке — создаешь объект в методе server activated объекта и возвращаешь на него указатель. Это если известно какой объект. Если не известно — передаешь с сервера ссылку на специальный объект-активатор, который по имени класса вернет тебе его экземпляр.
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.