Столкнулся я тут с проблемой:
Хочу создать удаленно объект. Вычитал что есть 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 ОБЪЕКТ ЕСЛИ НА КЛИЕНТЕ ДОСТУПНА ТОЛЬКО ИНФОРМАЦИЯ ОБ ИМПЛИМЕНТИРОВАННОМ В НЕМ ИНТЕРФЕЙСЕ?
Заранее огромное спасибо всем кто отзовется!
Здравствуйте 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" );
Здравствуйте 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 );
чтобы потом этот объект на все удаленные вызовы дергал хозяина...
т.о вопрос остается открытым...
Здравствуйте Joker3D, Вы писали:
Короче при создании на сервере можно сразу получить ссылку на класс а не на интерфейс:
static RemoteClass cl;
cl = ( RemoteClass )Activator.GetObject( typeof( RemInterface.RemoteInterface ), "
tcp://mfc:8000/RemoteURL" );
добавишь в класс необходимые методы и инициализируй что хочешь, все равно изврат, но по кранйне мере работает
П.С. Джо кинь мне пример работы Remoting с конфигурационными файлами, а то что-то у меня не получается ;(