我使用System.Messaging命名空间的非常方便的GetPrivateQueuesByMachine和GetPublicQueuesByMachine方法。我找不到相应的GetSystemQueuesByMachine,所以我写了自己的:
private MessageQueue[] GetSystemQueuesByMachine(string hostName)
{
MessageQueue[] queueList = new MessageQueue[3];
// System Journal
string queuePath = GetQueuePath(hostName, "system$;JOURNAL");
queueList[0] = new MessageQueue(queuePath);
// Get the Dead Letter queue
queuePath = GetQueuePath(hostName, "system$;DEADLETTER");
queueList[1] = new MessageQueue(queuePath);
// Transactional Dead Letter Queue
queuePath = GetQueuePath(hostName, "system$;DEADXACT");
queueList[2] = new MessageQueue(queuePath);
return queueList;
}
private static string GetQueuePath(string hostName, string queueName)
{
return "FormatName:DIRECT=OS:" + hostName + @"\" + queueName;
}
返回的queuePath看起来是正确的:
“FORMATNAME:DIRECT = OS:本地主机\系统$;作者”
但是当我尝试访问QueueName属性或调用GetAllMessages()方法时抛出异常:
“指定的格式名称不支持请求的操作。例如,无法删除直接队列格式名称。”
我知道如何以编程方式检索系统队列的内容(系统日志,死信和死信交易)?
答案 0 :(得分:0)
因此,事实证明,对于系统队列的实例,无法访问MessageQueue类的某些属性。 QueueName就是其中之一!
我最终使用自定义方法GetSystemQueuesByMachine创建了一个自定义类SystemMessageQueue。这将返回带有我用来填充ListView的自定义名称的MessageQueue实例,我仍然可以对MessageQueue实例使用GetAllMessages()。