Здравствуйте.
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! Как быть?
Читал в форумах: надо в каталог с сервером кидать сборки клиентов. а можно ли обойтись без этого (сервер не знаето клиентах)??
Спасибо.
Hello, "Alexey_Sarantsev"
> Вылетает 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! Как быть?
> Читал в форумах: надо в каталог с сервером кидать сборки клиентов. а можно ли обойтись без этого (сервер не знаето клиентах)??
>
Воспользуйся интерфейсами. На сервер будет достаточно кинуть только сборку с интерфейсами.
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>Воспользуйся интерфейсами. На сервер будет достаточно кинуть только сборку с интерфейсами.
Не получается. Ситуация такая: клиентское приложение — Windows Forms, Написал интерфейс:
using System;
namespace clientinterface
{
public interface ClientInterface
{
void OnEvent(string Message);
}
}
Клиент реализует интерфейс. На сервере: есть reference на интерфейс, + сама dll-ка разбросана всюду, где только можно

Вылетает тт же самый эксепшн.
Даже если пока без интерфейсов. Пусть уж на сервере хранятся сборки клиентов. Тогда, если я правильно понимаю, достаточно всего лишь в каталог с сервером скопировать exe-шник клиента?? Или я не прав?
Может все-таки в App.Config что-то не так...
Спасибо.
Здравствуйте, Аноним, Вы писали:
А>Может все-таки в App.Config что-то не так...
по-моему, в твоем случае все-таки TypeFilterLevel не выставлен. Отсылаю к MSDN — Automatic Deserialization in .NET Remoting, на всякий случай пример оттуда:
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 8085;
TcpChannel chan = new TcpChannel(props, null, provider);
или через config (см. выше).