我的Message Queue在哪里发送了消息?

时间:2011-08-16 12:43:07

标签: c# msmq

我有一个使用MSMQ的应用程序,当生产者和消费者都打开时,它运行得很好 同一台机器。

昨天,我第一次尝试创建另一台可在单独机器上运行的生产者。该 queue是一个私有队列,之前,双方都将其引用为

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

我尝试了几种方法从远程计算机引用此队列。我的服务器名称是“groucho”, 所以我试过

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

但是这始终抛出“无效的队列路径名”异常。

一位开发人员建议我尝试以下方法,以避免例外情况:

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

这不再引发异常,但它似乎也不起作用,因为我没有 看到队列中的消息。

服务器是Windows Server 2008 R2。队列已设置(我刚刚注意到),所以 “Everyone”可以接收和Peek,但不能发送,但是当我尝试添加“发送”时,我会得到 一个错误对话框,显示“无法设置安全描述符,错误:访问被拒绝”。 我在此框中拥有管理员权限。

通过阅读其他帖子我知道有各种各样的安全措施可以发挥作用, 但我在发件人或主机上的事件日志中都没有看到任何错误。

如果这是一个安全问题,我该如何看待问题是什么?

谢谢!

以下是完整的测试代码:

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("Sending message " + i);
          queue.Send(msgToSend, "otherpart");
        }

      }
      catch (MessageQueueException me)
      {
        Console.WriteLine("ERROR: caught message queue exception: " + me.Message);
      }

      Console.WriteLine("Type any key to exit...");
      input = Console.ReadLine();

    }
  }
}

3 个答案:

答案 0 :(得分:4)

如果您从一台服务器发送邮件然后查看出站队列,您应该会看到一个临时队列,该队列是为了传输您的邮件而创建的。您应该能够在队列中看到您的消息。

现在进入接收服务器。

要设置队列的权限,您需要拥有它的所有权。 在队列属性中 - &gt;安全标签 - &gt;高级 - &gt;所有者标签 - &gt;将所有者更改为。您应该在列表中看到您的Windows主体。

这将使您能够设置发送权限。完成此操作后,检查发送服务器上的出站队列,现在应该已传输该消息。

希望这有帮助。

答案 1 :(得分:1)

将以下内容添加到您的示例中。它应该显示在死信队列中,如果它没有被服务器处理。

...

queue = new MessageQueue(name);

queue.DefaultPropertiesToSend = new DefaultPropertiesToSend();

queue.DefaultPropertiesToSend.UseDeadLetterQueue = true;

...

答案 2 :(得分:0)

可能是您的msmq服务器上的安全问题。

尝试在队列中设置'everyone full control'