我的消息队列发送的消息去了哪里

本文关键字:消息 队列 我的 | 更新日期: 2023-09-27 18:05:38

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

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

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

我尝试了几种方法从远程机器引用这个队列。我的服务器名是"groucho",所以我尝试了

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

但这始终抛出"无效队列路径名"异常。

一位开发人员建议我尝试以下方法,以避免出现异常:

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

不再抛出异常,但它似乎也不起作用,因为我没有查看队列中的消息

服务器为Windows server 2008 R2。队列是这样设置的(我刚刚注意到)"每个人"都可以接收和偷看,但不能发送,但当我尝试添加"发送"时,我得到了出现错误对话框,提示"无法设置安全描述符,错误:拒绝访问"。我有这个盒子的Admin权限。

我从阅读其他帖子中知道,有各种各样的安全因素在起作用,但是我在发送者或主机的事件日志中没有看到任何错误。

如果这是一个安全问题,我怎么知道问题是什么?

谢谢!

下面是完整的测试代码:
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();
    }
  }
}

我的消息队列发送的消息去了哪里

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

现在转到接收服务器。

为了设置队列的权限,您需要获得队列的所有权。在队列属性->安全选项卡->高级->所有者选项卡->更改所有者为。您应该在列表中看到您的windows主体。

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

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

queue = new MessageQueue(name);
queue.DefaultPropertiesToSend = new DefaultPropertiesToSend();
queue.DefaultPropertiesToSend.UseDeadLetterQueue = true;

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

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