Здравствуйте.
Remoting... Первые шаги
Нужно заставить 2 (или более) приложений общаться между собой. Хочу реализовать так: на сервере активизируется объект некоторого класса, содержащего некоторе событие. На клиентах есть обработчики события. Клиент, который хочет что-то "сказать", вызывает событие, другие клиенты его обрабатывают.
Вообще, правильно ли я делаю?
Теперь сама реализация.
Тот самый класс (вернее, сборка с ним), активизируемый на сервере:
using System;
namespace Race
{
public delegate void RaceEvent (string Message);
interface IRaceInterface
{
void PutMessage (string Message);
event RaceEvent SendMessage;
}
public class RaceRemoteClass :MarshalByRefObject, IRaceInterface
{
public string Name;
public RaceRemoteClass() { }
public event RaceEvent SendMessage;
public void PutMessage (string Message)
{
if (SendMessage!=null) SendMessage(Message);
}
}
}
Далее: App.config для сервера:
<configuration>
<system.runtime.remoting>
<application name="ServerApplication">
<channels>
<channel ref="http" port="25001" />
<serverProviders>
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel="Full" />
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channels>
<service>
<wellknown
mode="Singleton"
type="Race.RaceRemoteClass, RaceRemoteClass"
objectUri="Test.rem" />
</service>
</application>
</system.runtime.remoting>
</configuration>
App.config для клиента:
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="0">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
<client>
<wellknown
type="Race.RaceRemoteClass, RaceRemoteClass"
url="http://localhost:25001/ServerApplication/Test.rem" />
</client>
</application>
</system.runtime.remoting>
</configuration>
Так же на клиенте:
RemotingConfiguration.Configure("ClientApplication.exe.config");
this.raceRemotedClass = new RaceRemoteClass(); //отрабатывает корректно
raceRemotedClass.SendMessage += new RaceEvent(this.OnEvent) ;
Вылетает Exception:
An unhandled exception of type 'System.Security.SecurityException' occurred in mscorlib.dll
Additional information: Type System.DelegateSerializationHolder and the types derived from it (such as System.DelegateSerializationHolder) are not permitted to be deserialized at this security level.
Понимаю, дело в настройках безопасности NET 1.1, но я же установил typeFilterLevel! Как быть?
Читал в форумах: надо в каталог с сервером кидать сборки клиентов. а можно ли обойтись без этого (сервер не знаето клиентах)??
Спасибо.