2017-06-05 101 views
1

我想构建一个非常简单的.Net远程连接,并且似乎无法弄清楚魔法咒语。.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,即时聊天requestMsg,ITransportHeaders requestHeaders,流requestStream ,即时聊天& responseMsg,ITransportHeaders & responseHeaders响应,流& responseStream)[0]时

异常重新抛出: 在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天reqMsg,我消息retMsg) 在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32类型) 在RemoteExampleServer.MyRemoteServerClass.DoSomething() 在RemoteExampleClient.Form1.button1_Click(对象发件人,EventArgs的在c)中: \ Aaron \ RemoteExampleClient \ Form1.cs:line 30} System.Exception {System.Runtime.Remoting.RemotingException}

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

感谢,

亚伦

PS。我更喜欢不涉及修改'App.config'xml的解决方案。如果可能的话,我想要在代码空间中配置.Net远程连接。

回答

0

问题是,在服务器端,您将对象的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(); 
} 

需要注意的是在客户端,你要注册在按钮单击处理通道。这只会工作一次;第二次单击该按钮时,您将收到来自RegisterChannel的异常,因为通道“tcp”已被注册。为了解决这个问题,你可以用一个单一的电话来替换这两条电话线RemotingServices.Connect,这将根据需要创建通道:

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