我有一个使用MSMQ的应用程序,当生产者和消费者在同一台机器上时,它运行得非常好。
昨天,我第一次尝试创建另一个生产者,它将在另一台机器上运行。队列是私有队列,在此之前,双方都将其作为参考。
string strQueueName = ".\Private$\MyQueue";
我尝试了几种方法来从远程机器引用这个队列。我的服务器名称是"groucho",因此我尝试了以下方式:
string strQueueName = "groucho\Private$\MyQueue";
但是这一直抛出“无效的队列路径名”异常。
一位开发者建议我尝试以下方法来避免异常:
string strQueueName = "FORMATNAME:DIRECT =OS:grouch\\private$\\SDVQueue";
这不再抛出异常,但似乎也不能工作,因为我在队列中看不到消息。
服务器是 Windows Server 2008 R2。队列被设置(我刚注意到)为“每个人”都可以接收和查看,但不能发送,但当我尝试添加“发送”时,会弹出一个错误对话框,显示“无法设置安全描述符,错误:拒绝访问”。我确实拥有此计算机上的管理员权限。
我从阅读其他帖子中了解到,有各种安全性问题需要考虑,但我在发件人或主机计算机的事件日志中没有看到任何错误信息。
如果这是安全问题,我该如何查看问题所在?
谢谢!
以下是完整的测试代码:
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();
}
}
}