2010-05-20 180 views
4

遠程處理異常 - 身份驗證失敗的例外。詳細消息說:「無法從傳輸連接讀取數據:連接已關閉。」無法從傳輸連接讀取數據:連接已關閉

我在創建兩個可以在C#中作爲遠程對象進行通信的簡單服務器時遇到了問題。 ServerInfo只是我創建的一個擁有IP和端口的類,可以返回地址。它工作正常,就像我以前用過的那樣,並且已經調試過了。此外,服務器啓動正常,沒有任何異常,並且通道註冊沒有問題。我使用Forms來完成接口,並調用服務器上的某些方法,但在調試時從FormsApplication傳遞參數給服務器時沒有發現任何問題。在這一章中似乎都很好。

public ChordServerProgram() 
     { 
      RemotingServices.Marshal(this, "PADIBook"); 
      nodeInt = 0; 
     } 

     public void startServer() 
     { 
      try 
      { 
       serverChannel = new TcpChannel(serverInfo.Port); 
       ChannelServices.RegisterChannel(serverChannel, true); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

我運行了這個程序的兩個實例。然後在應用程序的其中一個實例上調用startNode。端口很好,生成的地址也很好。正如你所看到的,我使用IP作爲本地主機,因爲這個服務器僅僅用於測試目的。

public void startNode(String portStr) 
      { 
       IPAddress address = IPAddress.Parse("127.0.0.1"); 
       Int32 port = Int32.Parse(portStr); 
       serverInfo = new ServerInfo(address, port); 

       startServer(); 

       //node = new ChordNode(serverInfo,this); 

      } 

然後,在其他的方面,再次通過接口,我調用另一個startNode方法,給它一個種子服務器來獲取信息。這是它出錯的地方。當它調用剛剛獲得的seedServer代理上的方法時,由於驗證失敗,會拋出RemotingException。 (我想要得到的參數是節點,我只是用INT以確保ChordNode類無關,此錯誤。)

 public void startNode(String portStr, String seedStr) 
     { 
      IPAddress address = IPAddress.Parse("127.0.0.1"); 
      Int32 port = Int32.Parse(portStr); 
      serverInfo = new ServerInfo(address, port); 

      IPAddress addressSeed = IPAddress.Parse("127.0.0.1"); 
      Int32 portSeed = Int32.Parse(seedStr); 
      ServerInfo seedInfo = new ServerInfo(addressSeed, portSeed);    

      startServer(); 

      ChordServerProgram seedServer = (ChordServerProgram)Activator.GetObject(typeof(ChordServerProgram), seedInfo.GetFullAddress()); 

//   node = new ChordNode(serverInfo,this); 
      int seedNode = seedServer.nodeInt; 
//   node.chordJoin(seedNode.self); 

     } 

回答

0

嘗試ensureSecurity設置爲false,它應該開始工作。
ChannelServices.RegisterChannel(serverChannel, false);

+0

是的,但是如果我們想要啓用安全性呢? – Gareth 2012-01-11 16:04:42

0

你指定安全是startserver的(你的遠程處理服務器上)必須具有:

ChannelServices.RegisterChannel(serverChannel, true); 

然而,「客戶」端未指定的安全性,因此授權錯誤。除非服務器安全設置設置爲'false',否則需要在兩端指定tcp通道安全性。在你的第二個方法的StartNode你需要使用Activator.GetObject之前做到以下幾點,注意無不像服務器端上的TcpChannel指定端口:

TcpChannel ClientChan = new TcpChannel();    
ChannelServices.RegisterChannel(ClientChan, true); 

此外,除非你是在一些代碼,做你的避風港」沒有給我們,你也似乎沒有註冊一個衆所周知的服務類型服務器端,雖然你說它一直在調試器中工作,所以也許這是沒有必要的情況下。請參閱MSDN on RegisterWellKnownServiceType

相關問題