Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> события, подключить у клиента 
:(
    Опции темы
Alexsar
  Дата 11.8.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



Всем доброго дня, ночи(нужное подчеркнуть) smile
Проблема заключается в следущем как осуществить обратную связь, т.е. когда сам объект активирует событие и вызывает делегаты клиентов. В книге по .Net Remoting орисан пример, где клиент подписывается на событие удалённого объекта. Но вот загвоздка, когда в клиентах производится подписание на событие например так

Код

msg.Msg += new MsgEventHandler(MessageReceived); 



возникает исключение : Type System.DelegateSerializationHolder and the types derived from it (such as System.DelegateSerializationHolder) are not permitted to be deserialized at this security level. 

Компилятор почему то не хочет это сделать, хотя для сервера он нормально проходит и можно вызывать клиентом методы удалённого объекта, в которых генерируется события и сервер их нормально обрабатывает.
Что нужно исправить чтоб подписать клиенты на события удалённого обекта, для примера привожу свой код:

1. Ob.dll: 

Код

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.Remoting; 

namespace Ob 
{ 
public delegate void MsgEventHandler(string Message); 

public class Messager : MarshalByRefObject 
{ 
public event MsgEventHandler Msg; 

public void SendMessage(string msg) 
{ 
NewMsg(msg); 
} 
} 
} 


2. Client.exe: 
Код

using System.Runtime.Remoting; 
using System.Runtime.Remoting.Channels; 
using System.Runtime.Remoting.Channels.Tcp; 
using Ob; 

namespace Client 
{ 
class Program 
{ 
public static void MessageReceived(string msg) 
{ 
Console.WriteLine("\n"+msg); 
} 

static void Main(string[] args) 
{ 
ChannelServices.RegisterChannel(new TcpChannel(0)); 
RemotingConfiguration.RegisterWellKnownClientType(typeof(Messager), "tcp://localhost:4000/Messager"); 

Messager msg = new Messager(); 
msg.Msg += new MsgEventHandler(MessageReceived); //Вот тут на самом деле всё стопорится, и возгикают новые ошибки, типа подсоедениться не может!!!


string message = ""; 
while (message != "exit") 
{ 
Console.Write("Enter message:"); 
message = Console.ReadLine(); 

msg.SendMessage(message); 
} 
} 
} 
} 




3. Server.exe : 
Код

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.Remoting; 
using System.Runtime.Remoting.Channels; 
using System.Runtime.Remoting.Channels.Tcp; 
using Ob; 

namespace Server 
{ 
class Program 
{ 

public void MessageReceived(string message)
{
Console.WriteLine("получено "+message);
}

static void Main(string[] args) 
{ 
TcpChannel channel = new TcpChannel(4000); 
ChannelServices.RegisterChannel(channel); 

RemotingConfiguration.RegisterWellKnownServiceType(typeof(Messager), "Messager", 
WellKnownObjectMode.Singleton); 

//виноват, накосячил, этой строки нет здесь
//msg.Msg += new MsgEventHandler(MessageReceived); //Вот тут всё стопорится

//а тут скажем такой код

Messager  dll = new Messagerl();
ObjRef obj = RemotingServices.Marshal(dll, "TcpService");
string s = Console.ReadLine(); 
dll.SendMessage(s);
//всё, вроде больше не накосячил

Console.WriteLine("Type Enter to exit..."); 
Console.ReadLine(); 
} 
} 
} 


что нужно исправить, чтоб всё заработало, желательно с этим примером
З.Ы. я только начал изучать .Net Remoting, помогите smile 

Это сообщение отредактировал(а) Alexsar - 18.8.2006, 23:10
PM MAIL   Вверх
mr.DUDA
Дата 12.8.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



При регистрации объекта на серверной стороне надо TypeFilterLevel выставить в TypeFilterLevel.Full
Например так: 

Код
ListDictionary channelProperties = new ListDictionary();
channelProperties.Add("port", 4000);
BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();

// вот эта строка
serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

TcpChannel channel = new TcpChannel(channelProperties, null, serverSinkProvider);



--------------------
user posted image
PM MAIL WWW   Вверх
Alexsar
Дата 18.8.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



TО mr.DUDA 
И снова я smile 
во-первых, хочу извиниться я немного накосячил с примером, я его отредактировал smile 

я пробовал так как написано выше в серверной сборке, не помогло smile 
вот фрагмент кода
Код

ListDictionary channelProperties = new ListDictionary();
channelProperties.Add("port", 4000);
BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();

// вот эта строка
serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

TcpChannel channel = new TcpChannel(channelProperties, null, serverSinkProvider);
ChannelServices.RegisterChannel(channel); 

RemotingConfiguration.RegisterWellKnownServiceType(typeof(Messager), "Messager", 
WellKnownObjectMode.Singleton); 



при компиляции клиента возникает ошибка, мол не могу подключиться, а если сервер вызывает метод удалённого объекта для отправки сообщения, то возникает так же ошибка: ссылочный объект не установлен, т.е. никто не подписался на обработку этого сообщения
вопрос открыт, что не так?
если есть на 100% рабочие коды, то буду благодарен smile 
PM MAIL   Вверх
mr.DUDA
Дата 19.8.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Проблема в том, что для того чтобы клиенту получить что-либо от сервера, необходимо клиенту самому что-то спросить у сервера (т.е. вызвать метод) - тогда и будут выполнены обработчики событий, сгенерированные сервером в процессе выполнения метода. По сути, если я ничего не путаю, вызов метода и обработка событий есть один большой вызов метода с клиента на сервер, где часть метода выполняется на сервере, а часть - на клиенте.

Как заставить клиент произвольно реагировать на события, генерируемые сервером - непонятно. Скорее всего, никак. Или создать обратную связь на уровне ремоутинга, т.е. TcpChannel "сервер->клиент" и т.д.


--------------------
user posted image
PM MAIL WWW   Вверх
Alexsar
Дата 19.8.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



Цитата(mr.DUDA @ 19.8.2006,  09:53)
Проблема в том, что для того чтобы клиенту получить что-либо от сервера, необходимо клиенту самому что-то спросить у сервера (т.е. вызвать метод) - тогда и будут выполнены обработчики событий, сгенерированные сервером в процессе выполнения метода. По сути, если я ничего не путаю, вызов метода и обработка событий есть один большой вызов метода с клиента на сервер, где часть метода выполняется на сервере, а часть - на клиенте.

не совсем понятно, т.е. я должен сначала вызвать метод удалённого объекта из клиента, а только потом подписывать на события?
т.е. так?
Код

...
ChannelServices.RegisterChannel(new TcpChannel(0)); 
RemotingConfiguration.RegisterWellKnownClientType(typeof(Messager), "tcp://localhost:4000/Messager"); 


Messager msg = new Messager(); 

//Скажем здесь я вызываю какой-либо метод объекта msg
//Или я должен вызвать конкретного типа метод, скажем который вызывает обработчик?

msg.Msg += new MsgEventHandler(MessageReceived); //и компилятор тут не будет генерить ошибки?
...


и ещё как создать обратную связь на уровне ремоутинга, т.е. TcpChannel "сервер->клиент", что это такое, создание нового удалённого объекта, который сделает клиент сервером, а первоначальный сервер клиентом?
PM MAIL   Вверх
mr.DUDA
Дата 19.8.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Цитата(Alexsar @  19.8.2006,  21:29 Найти цитируемый пост)
не совсем понятно, т.е. я должен сначала вызвать метод удалённого объекта из клиента, а только потом подписывать на события?т.е. так?

Нет. Подписаться клиентом на событие серверного объекта, а потом вызвать с клиента метод. Если серверный метод сгенерирует событие, то клиент обработает его. Вроде так. Ещё раз повторюсь, я не проверял это, просто по логике должно быть так.

Цитата(Alexsar @  19.8.2006,  21:29 Найти цитируемый пост)
и ещё как создать обратную связь на уровне ремоутинга, т.е. TcpChannel "сервер->клиент", что это такое, создание нового удалённого объекта, который сделает клиент сервером, а первоначальный сервер клиентом?

Да.


--------------------
user posted image
PM MAIL WWW   Вверх
Alexsar
Дата 20.8.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



а какой метод надо вызывать любой или конкретно, тот который генерит событие, например как у меня SendMessage?

на счёт создать обратную связь на уровне ремоутинга, т.е. TcpChannel "сервер->клиент", это я сделал, оба приложения нормально работают, это первое что я сделал. просто в книге встретил пример, где клиенты обрабатывают события сгенерированные сервером.
PM MAIL   Вверх
arilou
Дата 21.8.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 3
Всего: 61



Alexsar, нет. нельзя. не получится.только как ты сам сделал изначально, и как сказал mr.DUDA

почему? потому что вызов клиентского кода с сервера, чем по сути является вызов события с подписчиком, находящимся вне серверного апдомена, не сработает. почему? потому архитектура ремоутинга так построена, что это клиенты обращаются к серверу за чем либо, а не наоборот.



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1302 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.