2017-06-05 100 views
1

非常に単純な.Netリモート接続を構築しようとしていますが、魔法の呪文を理解できないようです。.Net Remotingエラー "要求されたサービスが見つかりません"

私はシングルトンを意味するサーバーサイドクラスを持っており、サービスプロセスの期間中は生きています。

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:

Serverのスタックトレースが見つかりません要求されたサービス:System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack、IMessageがrequestMsg、ITransportHeadersのrequestHeaders、ストリームrequestStreamで 、IMessageが& responseMsg、ITransportHeaders & responseHeaders、ストリーム& responseStream)[0]で

例外再スロー:System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessageがreqMsg、Iで CにおけるRemoteExampleClient.Form1.button1_Click(オブジェクト送信者、のEventArgs電子)でRemoteExampleServer.MyRemoteServerClass.DoSomethingでSystem.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(のMessageData & msgData、のInt32型でメッセージretMsg) ) () 。 \ 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(); 
} 

クライアント側では、ボタンクリックハンドラにチャネルを登録していることに注意してください。これは一度しか動作しません。もう一度ボタンをクリックすると、チャネル "tcp"がすでに登録されているため、RegisterChannelから例外が発生します。これを修正するには、2つの回線をRemotingServices.Connectへの1回の呼び出しで置き換えることができます。

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(); 
} 
関連する問題