我有一个非常简单的控制台应用程序,无法查看远程专用队列中的消息。
var queues = MessageQueue.GetPrivateQueuesByMachine(machineName);
var queue = queues.Where(x=>x.FormatName == queueName).Single();
Message message = queue.Peek();
Run Code Online (Sandbox Code Playgroud)
Peek 调用失败,并出现“访问消息队列系统被拒绝”的 MessageQueueException。
使用相同的客户端计算机和用户,我可以使用队列资源管理器和消息队列管理单元查看队列。
在使用本地队列进行实验时,我只能通过取消队列上的 Peek 权限来重现错误,但这也会在其他工具中阻止它。
我看到的很多信息都指出了此处概述的问题。
然而,似乎如果这些事情中的任何一个是问题,我也无法使用其他工具来完成它。
编辑 我已经能够使用MSMQQueueInfo / MSMQQueue COM 对象使其正常工作,而无需更改任何凭据。如果我可以使用 .NET 库使其工作,那就太好了,但至少我有一个解决方法。
我的问题是,当GetPrivateQueuesByMachine用于获取队列时,它使用的访问模式SendAndReceive要求比我拥有更多的权限。我必须使用 MessageQueue 构造函数来指定 AccessMode。(在本例中是“查看”。)
最后,我能够使用类似于以下的代码来使其工作:
var queue = new MessageQueue(@"FormatName:DIRECT=OS:machineName\private$\queueName", QueueAccessMode.Peek);
Message message = queue.Peek();
Run Code Online (Sandbox Code Playgroud)