C# 仅限MSMQ查看权限(即无接收权限)?
Summary(tl;dr):我们正在尝试设置一个具有C# 仅限MSMQ查看权限(即无接收权限)?,c#,msmq,C#,Msmq,Summary(tl;dr):我们正在尝试设置一个具有Peek访问权限但不具有Receive访问权限的队列,用于测试目的(因此Receive请求将失败,但Peek将成功),但MSFT似乎使这一过程比预期更加困难 背景:我们有一个本地私有MSMQ队列,一个进程从中接收和处理(/consumer)消息。在某些情况下,处理无法完成,消息仍留在队列中(例如,转发目的地暂时脱机)。因此,增加了一个监视器,每10分钟查看一次队列,查看顶部的消息是否相同-如果消费者被暂停(相同的消息在顶部),监视器会触发警报
Peek
访问权限但不具有Receive
访问权限的队列,用于测试目的(因此Receive
请求将失败,但Peek
将成功),但MSFT似乎使这一过程比预期更加困难
背景:我们有一个本地私有MSMQ队列,一个进程从中接收和处理(/consumer)消息。在某些情况下,处理无法完成,消息仍留在队列中(例如,转发目的地暂时脱机)。因此,增加了一个监视器,每10分钟查看一次队列,查看顶部的消息是否相同-如果消费者被暂停(相同的消息在顶部),监视器会触发警报以指示出现问题
为了强制队列暂停以进行测试(确保监视器功能正常工作),我们认为只需从队列本身删除(但不拒绝)接收
权限,但仍允许Peek
(重新启动MSMQ和一切以强制执行新权限),理想情况下,这将允许监视器查看消息,而不允许任何人接收消息,“暂停”队列并生成警报
然而,在测试该场景时,我遇到了一个似乎阻碍了这种方法的异常:
System.Messaging.MessageQueueException: Access to Message Queuing system is denied.
at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
at System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 timeout, Int32 action, MQPROPS properties, NativeOverlapped* overlapped, ReceiveCallback receiveCallback, CursorHandle cursorHandle, IntPtr transaction)
at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
at System.Messaging.MessageQueue.Peek(TimeSpan timeout)
这表明(至少对我来说)Peek()
在内部调用ReceiveCurrent()
,并且必须尝试一个事务性的Receive
,它将在获取消息后回滚/中止。启动.NET Reflector后,我发现Peek
的所有实例都调用了Receive
的一些变体,因此不同的Peek
不会有帮助。因此,似乎需要Receive
权限才能Peek
,就队列设计而言,这似乎有点愚蠢
请注意,消费者和监视器都使用相同的帐户(/权限),此时更改监视方法(使用Peek
)不是一个可行的选择(因为这将需要对需求、规范和生产代码进行重大更改,这将使成本超过其价值)(尽管我想,如果你真的必须这样做,你也可以提出监控方法的改变,因为如果其他人遇到同样的事情,它们可能会对他们有用)
最后,问题是:是否有更好的(甚至只是不同的:p)方法在队列顶部查看而无需接收权限?或者有其他方法设置权限(通过权限界面、通过代码等)这样,Receive
本身失败,但ReceiveCurrent
和Peek
工作所需的其他方法