c# - .Net 远程处理错误 "Requested Service not found"

标签 c# .net .net-remoting

我正在尝试构建一个非常简单的 .Net 远程连接,但似乎无法理解魔法咒语。

我有一个服务器端类,它是一个单例并且在服务过程期间存在。

public class MyRemoteServerClass : MarshalByRefObject
{
    public void DoSomething()
    {
        System.Diagnostics.Trace.Assert(false);
    }

    public override object InitializeLifetimeService()
    {
        return null;
    }
}

根据我对 .Net 远程处理的阅读,我编写了这段代码来在服务中实例化和注册服务器类:

    static void Main(string[] args)
    {
        MyRemoteServerClass server = new MyRemoteServerClass();
        TcpChannel channel = new TcpChannel(8080);
        ChannelServices.RegisterChannel(channel, false);
        string url = "tcp://localhost:8080/MyRemoteServerClass";
        RemotingServices.Marshal(server, url, server.GetType());
        System.Console.ReadLine();
    }

我在 .Net winforms 客户端中编写了这段代码来调用“MyRemoteServerClass.DoSomething”函数:

    private void button1_Click(object sender, EventArgs e)
    {
        string url = "tcp://localhost:8080/MyRemoteServerClass";
        ChannelServices.RegisterChannel(new TcpChannel(), false);
        MyRemoteServerClass root = Activator.GetObject(typeof(MyRemoteServerClass), url) as MyRemoteServerClass;
        root.DoSomething();
    }

“Activate.GetObject”调用似乎是为了获取对服务器“MyRemoteServerClass”实例的代理引用。但是,当我调用“DoSomething”时,出现“未找到请求的服务”异常。

{System.Runtime.Remoting.RemotingException: 找不到请求的服务

服务器堆栈跟踪: 在 System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack,IMessage requestMsg,ITransportHeaders requestHeaders,Stream requestStream,IMessage&responseMsg,ITransportHeaders&responseHeaders,Stream&responseStream)

异常在 [0] 重新抛出: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 RemoteExampleServer.MyRemoteServerClass.DoSomething() 在 RemoteExampleClient.Form1.button1_Click(Object sender, EventArgs e) 在 c:\Aaron\RemoteExampleClient\Form1.cs:line 30} System.Exception {System.Runtime.Remoting.RemotingException}

我做错了什么?请注意,我已允许通过防火墙访问这些应用程序(当我完全禁用防火墙时,我会得到相同的行为)。我的计算机上没有其他安全软件。

谢谢,

亚伦

附言。我更喜欢不涉及修改“App.config”xml 的解决方案。如果可能的话,我希望在代码空间中配置 .Net 远程连接。

最佳答案

问题是,在服务器端,您将对象的 URI 指定为其完整 URL。本例中的 URI 只是 "MyRemoteServerClass"。所以要修复它,将服务器主要方法更改为:

static void Main(string[] args)
{
    MyRemoteServerClass server = new MyRemoteServerClass();
    TcpChannel channel = new TcpChannel(8080);
    ChannelServices.RegisterChannel(channel, false);
    string uri = "MyRemoteServerClass";
    RemotingServices.Marshal(server, uri, server.GetType());
    System.Console.ReadLine();
}

请注意,在客户端,您要在按钮单击处理程序中注册 channel 。这只会工作一次;第二次单击该按钮时,您将从 RegisterChannel 收到异常,因为 channel “tcp”已注册。要解决此问题,您可以将这两行替换为对 RemotingServices.Connect 的一次调用,这将根据需要创建 channel :

private void button1_Click(object sender, EventArgs e)
{
    string url = "tcp://localhost:8080/MyRemoteServerClass";
    MyRemoteServerClass root = RemotingServices.Connect(typeof(MyRemoteServerClass), 
        url) as MyRemoteServerClass;
    root.DoSomething();
}

关于c# - .Net 远程处理错误 "Requested Service not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44373484/

相关文章:

C# 无法加载 DLL(找不到模块 HRESULT : 0x8007007E)

c# - 从c#中的linux "ps"命令输出解析进程启动时间

c# - 尝试针对 Visual Studio 2015 中的特定 .NET 版本

c# - 使用具有不同类型详细信息的主从 View

c# - .Net 4.5 中有什么新内容可以更好地处理 JSON 吗?

c# - 如何在 .NET Remoting 中远程处理事件?

c# - EasyHook,.NET Remoting 在客户端和服务器之间共享接口(interface)?

c# - FindAsync 和 Include LINQ 语句

.net - 每个开发人员的工具箱中都应该有哪些可重用代码?

wcf - 我的测试表明 .NET Remoting 比 WCF 4 快 1.5 倍