2010-05-24 3 views
2

J'écris une application simple console client-serveur en utilisant MSMQ. J'essaie de l'exécuter sur le groupe de travail que nous avons mis en place. Ils fonctionnent très bien lorsqu'ils sont exécutés sur le même ordinateur, mais je n'arrive pas à les connecter au réseau. Je ai essayé d'ajouter Direct=, OS:, et un tas de combinaisons d'autres préfaces, mais je suis à court d'idées, et évidemment ne sais pas la bonne façon de le faire. Ma file d'attente n'a pas de GUID, ce qui est aussi légèrement déroutant. Chaque fois que je tente de me connecter à une machine distante, j'obtiens un message de nom de file d'attente invalide. Que dois-je faire pour que cela fonctionne?Comment puis-je me connecter à MSMQ via un groupe de travail?

Serveur:

class Program 
{ 
    static string _queue = @"\Private$\qim"; 
    static MessageQueue _mq; 
    static readonly object _mqLock = new object(); 

    static void Main(string[] args) 
    { 
     _queue = Dns.GetHostName() + _queue; 
     lock (_mqLock) 
     { 
      if (!MessageQueue.Exists(_queue)) 
       _mq = MessageQueue.Create(_queue); 
      else 
       _mq = new MessageQueue(_queue); 
     } 
     Console.Write("Starting server at {0}:\n\n", _mq.Path); 
     _mq.Formatter = new BinaryMessageFormatter(); 
     _mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive); 
     while (Console.ReadKey().Key != ConsoleKey.Escape) { } 
     _mq.Close(); 
    } 

    static void OnReceive(IAsyncResult result) 
    { 
     Message msg; 
     lock (_mqLock) 
     { 
      try 
      { 
       msg = _mq.EndReceive(result); 
       Console.Write(msg.Body); 
      } 
      catch (Exception ex) 
      { 
       Console.Write("\n" + ex.Message + "\n"); 
      } 
     } 
     _mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive); 
    } 
} 

Client:

class Program 
{ 
    static MessageQueue _mq; 

    static void Main(string[] args) 
    { 
     string queue; 
     while (_mq == null) 
     { 
      Console.Write("Enter the queue name:\n"); 
      queue = Console.ReadLine(); 
      //queue += @"\Private$\qim"; 
      try 
      { 
       if (MessageQueue.Exists(queue)) 
        _mq = new MessageQueue(queue); 
      } 
      catch (Exception ex) 
      { 
       Console.Write("\n" + ex.Message + "\n"); 
       _mq = null; 
      } 
     } 
     Console.Write("Connected. Begin typing.\n\n"); 
     _mq.Formatter = new BinaryMessageFormatter(); 
     ConsoleKeyInfo key = new ConsoleKeyInfo(); 
     while (key.Key != ConsoleKey.Escape) 
     { 
      key = Console.ReadKey(); 
      _mq.Send(key.KeyChar.ToString()); 
     } 
    } 
} 
+0

Il semble que vous ayez créé une file d'attente privée; vous avez sûrement besoin de créer un public? –

+0

Non. Les files d'attente privées devraient fonctionner. – dlras2

Répondre

3

Vous devez utiliser ce format pour se connecter à une file d'attente privée à distance:

FormatName:Direct=OS:machinename\\private$\\queuename 

Il y a un outil pratique article here avec un peu plus d'info

+0

J'ai juste essayé cela, et dit qu'il est incapable de déterminer si la file d'attente existe ou non. – dlras2

+0

Des documents pour Exists: "Exists (String) ne peut pas être appelé pour vérifier l'existence d'une file d'attente privée distante" See http://blogs.msdn.com/b/johnbreakwell/archive/2008/07/ 31/check-if-msmq-queues-exist-est-hard-work-so-should-you-bother.aspx pour une alternative. – stuartd

+0

Ah. Peut-être que je vais juste me fier à l'instruction Try. – dlras2

1

Je me suis mis au travail, une fois. Ma recommandation serait 1: ne pas le faire, 2: ne pas le faire, 3: n'utiliser que des files d'attente privées et affecter les adresses IP statiques des stations de travail dans le sous-réseau 192.168.x.x. Fournissez à chaque machine un fichier hôte pour mapper les noms de machines sur les adresses IP ou utilisez directement l'adresse IP dans le nom de format. S'appuyant sur la résolution de noms dans un groupe de travail espère gagner à jouer à la roulette à Vegas.

Questions connexes