3 votes

Où sont passés les messages envoyés par ma file d'attente de messages ?

J'ai une application qui utilise MSMQ et qui fonctionne très bien lorsque le producteur et le consommateur sont sur la même machine.

Hier, pour la première fois, j'ai essayé de créer un autre producteur qui s'exécuterait sur une machine séparée. La file d'attente est une file d'attente privée, et avant, les deux côtés la référençaient comme

string strQueueName = ".\Private$\MyQueue";

J'ai essayé plusieurs façons de référencer cette file d'attente à partir de la machine distante. Mon nom de serveur est "groucho", donc j'ai essayé

string strQueueName = "groucho\Private$\MyQueue";

mais cela a systématiquement généré une exception "nom de chemin de file d'attente non valide".

Un collègue développeur m'a suggéré d'essayer ce qui suit, ce qui évite l'exception :

string strQueueName = "FORMATNAME:DIRECT =OS:grouch\\private$\\SDVQueue";

Cela ne génère plus l'exception, mais cela ne semble pas fonctionner non plus, car je ne vois pas les messages dans la file d'attente.

Le serveur est Windows Server 2008 R2. La file d'attente est configurée (je viens de le remarquer) de sorte que "Everyone" peut Recevoir et Examiner, mais pas Envoyer, mais lorsque j'essaie d'ajouter "Envoyer", j'obtiens une boîte de dialogue d'erreur qui dit "Le descripteur de sécurité ne peut pas être défini, Erreur : Accès refusé". J'ai bien des privilèges d'administrateur sur cette machine.

Je sais, d'après la lecture d'autres publications, qu'il y a toutes sortes de problèmes de sécurité en jeu, mais je ne vois aucune erreur dans les journaux d'événements sur l'expéditeur ou la machine hôte.

S'il s'agit d'un problème de sécurité, comment puis-je voir quel est le problème?

Merci!

Voici le code de test complet :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Messaging;

namespace RemoteQueue
{
  class Program
  {
    static void Main(string[] args)
    {
      string name = "FORMATNAME:DIRECT =OS:groucho\\private$\\SDVQueue";;
      string input = null;
      MessageQueue queue = null;

      try
      {
        queue = new MessageQueue(name);
        string key = "key";

        for (int i = 0; i < 200; i++)
        {
          Message msgToSend = new Message();
          string value = "value_" + i;

          msgToSend.Body = string.Format("{0},{1}", key, value);

          Console.WriteLine("Envoyer le message " + i);
          queue.Send(msgToSend, "otherpart");
        }

      }
      catch (MessageQueueException me)
      {
        Console.WriteLine("ERREUR : exception de file d'attente de message capturée : " + me.Message);
      }

      Console.WriteLine("Tapez une touche pour quitter...");
      input = Console.ReadLine();

    }
  }
}

4voto

Tom Redfern Points 11800

Si vous envoyez un message depuis un serveur, puis que vous regardez dans vos files d'attente sortantes, vous devriez voir une file temporaire qui a été créée dans le but de transmettre votre message. Vous devriez pouvoir voir votre message dans la file d'attente.

Maintenant, passez au serveur de réception.

Pour définir les autorisations sur la file d'attente, vous devez en devenir propriétaire. Dans les propriétés de la file d'attente -> onglet Sécurité -> Avancé -> onglet Propriétaire -> Changer le propriétaire en. Vous devriez voir votre principal de Windows dans la liste.

Cela vous permettra de définir les autorisations d'envoi. Une fois cela fait, vérifiez les files d'attente sortantes sur le serveur d'envoi et le message devrait maintenant être transmis.

J'espère que cela vous aide.

1voto

Trent Points 794

Ajoutez ce qui suit à votre exemple. Il devrait apparaître dans la file d'attente des lettres mortes s'il n'est pas traité par le serveur.

...

queue = new MessageQueue(name);

queue.DefaultPropertiesToSend = new DefaultPropertiesToSend();

queue.DefaultPropertiesToSend.UseDeadLetterQueue = true;

....

0voto

PEtter Points 43

Pourrait être un problème de sécurité sur votre serveur MSMQ.

Essayez de définir le contrôle total pour 'Tout le monde' sur la file d'attente

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X