RemotingException при вызове методов на прокси клиенту - PullRequest
0 голосов
/ 02 января 2012
using System;
using System.Collections;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("press any key plus enter to create server: ");
            if (Console.ReadLine().Length > 0)
            {
                var serverProv = new BinaryServerFormatterSinkProvider();
                serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
                IDictionary props = new Hashtable();
                props["port"] = 17017;
                props["name"] = "tcp server";
                var channel = new TcpChannel(props, null, serverProv);
                ChannelServices.RegisterChannel(channel, false);

                RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server), "server",
                                                                   WellKnownObjectMode.Singleton);
                Console.WriteLine("Server created");
            }
            else
            {
                ChannelServices.RegisterChannel(new TcpChannel(), false);
                Server server = (Server)Activator.GetObject(typeof(Server), "tcp://localhost:17017/server");
                Client client = new Client();
                client.Connect(server);
            }
            Console.ReadLine();
        }
    }

    class Server : MarshalByRefObject
    {
        //private List<Client> cilents = new List<Client>();

        public event EventHandler ClientedAdded;

        public void AddClient(Client client)
        {
            if (ClientedAdded != null)
            {
                foreach (EventHandler handler in ClientedAdded.GetInvocationList())
                {
                    handler.BeginInvoke(this, EventArgs.Empty, null, null);
                }
            }
        }
    }

    class Client : MarshalByRefObject
    {
        public void Connect(Server server)
        {
            server.ClientedAdded += server_ClientedAdded;

            server.AddClient(this);
        }

        void server_ClientedAdded(object sender, EventArgs e)
        {
            Console.WriteLine("server_ClientedAdded");
        }
    }
}

Сначала запустите exe и создайте сервер.Затем запустите исполняемый файл и создайте клиент, нажав Введите напрямую.

Исключение будет выдано handler.BeginInvoke(this, EventArgs.Empty, null, null);.

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

Так как это исправить?

Я нашел похожий вопрос на http://www.codeguru.com/forum/showthread.php?t=420124. Автор предоставил решение, но оно слишком короткое для меня, чтобы понять.

Ответы [ 2 ]

0 голосов
/ 21 января 2012

Я решил это!

Просто попробуйте использовать

handler(this, EventArgs.Empty)

вместо

handler.BeginInvoke(this, EventArgs.Empty, null, null); 

Я получил исключение, сказав, не может вызвать приватный метод .

Тогда проблема ясна, и я делаю server_ClientedAdded общедоступным.

Теперь код работает!

0 голосов
/ 02 января 2012

Я не знаю, в чем может быть проблема, но 2 дня назад мне пришлось кодировать крошечное приложение, используя ту же технику (каналы TCP)

Вот фрагмент кода (он работает хорошо,проверено много раз):

Сервер:

    TcpChannel chan = new TcpChannel(8086);
    ChannelServices.RegisterChannel(chan);
    RemotingConfiguration.RegisterWellKnownServiceType
    (Type.GetType("ClockBiometric.RequestServer"),
    "checkFingerprintTemplate", WellKnownObjectMode.Singleton);

Клиент:

RequestServer obj =
                  (RequestServer)Activator.GetObject(typeof(ClockBiometric.RequestServer)
                                                     ,"tcp://localhost:8086/checkFingerprintTemplate");
                if (obj == null)
                    // couldn't reach server
                else obj.checkFingerprintTemplate(1300, "abcd"); // just call some function

И класс RequestServer:

public class RequestServer : MarshalByRefObject
{
    public RequestServer()
    {
    }

    public void checkFingerprintTemplate(int iIndexNum, String sTemplate)
    {
        doSomeStuff();
    }
}

Надеюсь, это поможет!

...