2010-05-20 30 views
4

L'exception est Remoting Exception - Authentication Failure. Le message détaillé indique "Impossible de lire les données de la connexion de transport: la connexion a été fermée."Impossible de lire les données de la connexion de transport: la connexion a été fermée

J'ai des problèmes avec la création de deux serveurs simples qui peuvent communiquer en tant qu'objets distants en C#. ServerInfo est juste une classe que j'ai créée qui contient l'adresse IP et le port et peut rendre l'adresse. Cela fonctionne bien, comme je l'ai déjà utilisé, et je l'ai débogué. De plus, le serveur démarre correctement, aucune exception n'est levée et le canal est enregistré sans problème. J'utilise Forms pour faire les interfaces, et appelle certaines des méthodes sur le serveur, mais n'a pas trouvé de problèmes en passant les paramètres de FormsApplication au serveur lors du débogage. Tout semble bien dans ce chapitre.

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()); 
      } 
     } 

Je cours deux instances de ce programme. Ensuite, startNode est appelé sur l'une des instances de l'application. Le port est bien, l'adresse générée est bien aussi. Comme vous pouvez le voir, j'utilise l'adresse IP pour localhost, car ce serveur ne sert qu'à tester.

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); 

      } 

Puis, dans l'autre istance, à travers l'interface à nouveau, j'appelle une autre méthode startNode, lui donnant un serveur de semences pour obtenir des informations à partir. C'est là que ça ne va pas. Quand il appelle la méthode sur le proxy seedServer qu'il vient de recevoir, une exception RemotingException est lancée, en raison d'un échec d'authentification. (Le paramètre Je veux obtenir est le nœud, je suis juste en utilisant l'int pour vous assurer que la classe ChordNode n'a rien à voir avec cette erreur.)

 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); 

     } 

Répondre

0

Définissez la ensureSecurity false, et il devrait commencer à travailler.
ChannelServices.RegisterChannel(serverChannel, false);

+0

Oui, mais si nous voulons que la sécurité soit activée? – Gareth

0

Vous avez indiqué que la sécurité est un must sur votre serveur Remoting dans startServer() avec:

ChannelServices.RegisterChannel(serverChannel, true); 

Pourtant, la fin 'client' ne précise pas la sécurité, d'où l'erreur d'autorisation . Vous devez spécifier la sécurité du canal tcp aux deux extrémités sauf si le paramètre de sécurité du serveur est défini sur "false". Dans votre deuxième méthode startNode que vous devez faire ce qui suit avant d'utiliser Activator.GetObject, notez aucun port spécifié sur la TcpChannel contrairement à la fin du serveur:

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

De plus, à moins que vous faites dans un code que vous n » Nous ne vous semblons pas avoir enregistré un serveur de type service bien connu, bien que vous disiez que cela fonctionne dans le débogueur, alors peut-être que ce n'est pas nécessaire dans le cas. Voir MSDN on RegisterWellKnownServiceType.