gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:06 25 4
gpt4 key购买 nike

我正在尝试构建一个非常简单的 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com