Клиент-серверное приложение выдает ошибку по части безопасности - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Заранее прошу прощения, если выражаюсь неясно или неточно, с удаленным взаимодействием работать еще не приходилось. Решил попробовать создать клиент-серверное приложение (некий аналог чата для двух человек). Для этого создал удаленный объект, к которому обращаются и клиент, и сервер. По идее, клиент изменяет переменную и через делегат удаленного объекта вызывает функцию для вывода этой переменной на экран на сервере, аналогично сервер вызывает через делегат удаленного объекта функцию для вывода на клиенте. Код компилируется, но при запуске при добавлении метода в делегат вылетает ошибка:
Сериализация для типа System.DelegateSerializationHolder и производных от него типов (например, System.DelegateSerializationHolder) на этому уровне безопасности запрещена.
Код сервера:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using RemoteObject;
 
namespace RemoteServer
{
    public class Program
    {
        public static RemoteObject.RemoteObject sample;
        static void Main(string[] args)
        {
            HttpChannel c = new HttpChannel(32469);
            ChannelServices.RegisterChannel(c, false);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.RemoteObject), "RemoteMsgObj.soap", WellKnownObjectMode.Singleton);
            object RemoteObj = Activator.GetObject(typeof(RemoteObject.RemoteObject), "http://127.0.0.1:32469/RemoteMsgObj.soap");
            sample = (RemoteObject.RemoteObject)RemoteObj;
            try
            {
                sample.AddPassiveReceiver(Visualise); //Здесь вылетает ошибка
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.WriteLine();
            }
            Thread thr = new Thread(WaitText);
            thr.Start();
        }
 
        public static void Visualise(string msg)
        {
            Console.WriteLine(msg);
        }
 
        public static void WaitText()
        {
            //...
        }
    }
}
Код удаленного объекта:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace RemoteObject
{
    public class RemoteObject: MarshalByRefObject
    {
        public string activeMessage;
        public string passiveMessage;
 
        public RemoteObject()
        {
            activeMessage = "";
            passiveMessage = "";
        }
 
        public delegate void ActiveMessageReceive(string msg);
        public delegate void PassiveMessageReceive(string msg);
        public ActiveMessageReceive actmesres;
        public PassiveMessageReceive pasmesres;

        public void AddActiveReceiver(ActiveMessageReceive clientmethod)
        {
            actmesres = clientmethod;
        }
 
        public void AddPassiveReceiver(PassiveMessageReceive clientmethod)
        {
            pasmesres = clientmethod;
        }
        public void SendMessageToPassive()
        {
            if (pasmesres != null)
            {
                pasmesres(activeMessage);
            }
        }
 
        public void SendMessageToActive()
        {
            if (actmesres != null)
            {
                actmesres(passiveMessage);
            }
        }
    }
}
Можно ли что-то сделать, чтобы этот код заработал?

Решение задачи: «Клиент-серверное приложение выдает ошибку по части безопасности»

textual
Листинг программы
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application>
      <channels>
        <channel ref="http">
          <clientProviders>
            <formatter ref="binary" />
          </clientProviders>
          <serverProviders>
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы