Мастера .NET REMOTING, отзовитесь !!!
От: MegaWolf510  
Дата: 28.02.06 10:27
Оценка:
Господа, уже очень долго мучаюсь с одной проблемой с .NET REMOTING, которая
просто перечёркивает её дальнейшее изучение...

Проблема общая, связанная с тем, что, конечно, легко осуществлять в ремотинг прямую связь, тоесть вызываеть
методы удалённого объекта, но вот как насчёт обратной связи??? когда сам объект активирует событие и вызывает
делегаты клиентов??? Везде в книгах, где я только не смотрел, ничего не написано про мою проблему...
Все обещают, что если напишешь прогу в этом стиле(как в примере), то обязательно будет работать...
В общем, на обратной связи у меня и проблема. Когда в клиентах производится подписание на событие

msg.NewMsg += new NewMsgEventHandler(MessageReceived);

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

для примера я наклепал код:
(Все сборки со строгим именем, в программах клиент и сервер установил режим полного доверия (Проект->Properties->
Security->Enable ClickOnce Security Settings->This is a full trust application);

1. Sdk.dll:

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

namespace Sdk
{
public delegate void NewMsgEventHandler(string Message);

public class Messager : MarshalByRefObject
{
public event NewMsgEventHandler NewMsg;

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 Sdk;

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.NewMsg += new NewMsgEventHandler(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 Sdk;

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

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

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


--------------------------------------------------!!!Очень буду благодарен !!!-----------------------------------



28.02.06 13:32: Перенесено модератором из 'Сети, сокеты, протоколы' — Хитрик Денис
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.