我有一个使用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();
}
}
}
答案 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'