Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅限MSMQ查看权限(即无接收权限)?_C#_Msmq - Fatal编程技术网

C# 仅限MSMQ查看权限(即无接收权限)?

C# 仅限MSMQ查看权限(即无接收权限)?,c#,msmq,C#,Msmq,Summary(tl;dr):我们正在尝试设置一个具有Peek访问权限但不具有Receive访问权限的队列,用于测试目的(因此Receive请求将失败,但Peek将成功),但MSFT似乎使这一过程比预期更加困难 背景:我们有一个本地私有MSMQ队列,一个进程从中接收和处理(/consumer)消息。在某些情况下,处理无法完成,消息仍留在队列中(例如,转发目的地暂时脱机)。因此,增加了一个监视器,每10分钟查看一次队列,查看顶部的消息是否相同-如果消费者被暂停(相同的消息在顶部),监视器会触发警报

Summary(tl;dr):我们正在尝试设置一个具有
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
工作所需的其他方法