Есть Wellknown Singletion service, запускаемый со следующим конфигом:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<lifetime
leaseTime="10M"
sponsorshipTimeOut="2M"
renewOnCallTime="2M"
leaseManagerPollTime="10S"
/>
<service>
<wellknown mode="Singleton"
type="MTESRLServer, MTESRL_Server"
objectUri="MTESRLServerURI.rem"/>
</service>
<channels>
<channel ref="http" port="20000">
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
И есть клиент, который работает с ним, будучи зарегистрированным так (создавал объект просто через new):
try
{//
//Регистрация канала.
IDictionary props = new Hashtable();
props["typeFilterLevel"] = "Full";
props["port"] = "0";
BinaryServerFormatterSinkProvider SformatterProvider = new BinaryServerFormatterSinkProvider(props, null);
BinaryClientFormatterSinkProvider CformatterProvider = new BinaryClientFormatterSinkProvider(props, null);
HttpChannel h = new HttpChannel(props, CformatterProvider, SformatterProvider);
ChannelServices.RegisterChannel(h, false);
}
catch { }
// Регистрация общеизвестного типа.
try
{
WellKnownClientTypeEntry remotetype =
new WellKnownClientTypeEntry(typeof(MTESRLServer),
http://localhost:20000/MTESRLServerURI.rem);
RemotingConfiguration.RegisterWellKnownClientType(remotetype);
}
catch { }
И не работает со следующим конфигом:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown
type="MTESRLServer, MTESRL_Server"
url="
http://localhost:20000/MTESRLServerURI.rem" />
</client>
<channels>
<channel ref="http client" port="0">
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
Вся беда в том, что по видимому создавать клиентский объект через new нельзя - создается локальный экземпляр, необходимо использовать Activator.GetObject(). А ему в качестве параметра передается тип.
Так вот тип серверного объекта через Type.GetType("MTESRL_Server.MTESRLServer") или Type.GetType("MTESRLServer") мне получить не удалось - возвращает null.
А если:
foreach (WellKnownClientTypeEntry W in RemotingConfiguration.GetRegisteredWellKnownClientTypes())
if (W.TypeName == "MTESRLServer")
{
t = W.ObjectType;
url = W.ObjectUrl;
break;
}
то t опять null, хотя url - правильный.
Получается только так:
MTESRLServer m = new MTESRLServer(); //Здесь объект локальный
t = m.GetType();
m = (MTESRLServer)Activator.GetObject(t, url); // А здесь уже transparent proxy
Что за #$@% и как быть? Не хочу создовать локальный объект перед его remote аналогом.