在客户端上调用代理方法时的RemotingException

时间:2012-01-02 07:22:53

标签: c# .net remoting

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并创建一个服务器。然后运行exe并直接按 Enter 创建客户端。

handler.BeginInvoke(this, EventArgs.Empty, null, null);会抛出异常。

  

此远程处理代理没有通道接收器,这意味着服务器   没有正在收听的注册服务器频道,或者这个   应用程序没有合适的客户端通道与服务器通信。

那么如何解决呢?

我在http://www.codeguru.com/forum/showthread.php?t=420124上发现了类似的问题。作者提供了一个解决方案,但对我来说太简短了。

2 个答案:

答案 0 :(得分:0)

我不知道可能是什么问题,但是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();
    }
}

希望这有帮助!

答案 1 :(得分:0)

我解决了!

尝试使用

handler(this, EventArgs.Empty)

而不是

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

我有一个例外,说无法调用私有方法

然后问题很明显,我将server_ClientedAdded公之于众。

现在代码可以使用了!