无法为日志队列构造 MessageQueue 对象

Cannot construct MessageQueue object for journal queue

我无法构建 MessageQueue 对象来访问我的应用程序之一使用的目标日志队列。

当我执行

MessageQueue journalQ = new MessageQueue("my_computer\private$\test queue")

我可以构造一个消息队列。

我已验证测试队列存在并且它有一个启用的日志队列并有一条消息。

当我执行

MessageQueue journalQ = new MessageQueue("my_computer\private$\test queue\Journal$")

我无法构建队列,当查看我的本地人时,我得到 MessageQueueException 异常抛出说 The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted.

我尝试了多种不同的路径格式组合,包括完整的 "Format=OS" 和更多剖析的字符串,以及“;journal”而不是“\journal”

string journalPath = (messageQueueList[choiceInt].Path.Split(':')[2].Split('$')[0]
                      + "$"
                      + messageQueueList[choiceInt].Path.Split('$')[1]
                      + "\Journal$"
                     );

journalQ = new MessageQueue(journalPath);

您不能直接将消息发送到日志队列,您只能从那些接收消息。访问期刊 MessageQueue 对象的发送相关成员将引发您在问题中引用的异常。拿下面的例子代码:

static void Main(string[] args)
{
    // Create queue
    string queueName = "computer_name\private$\test queue";
    MessageQueue.Create(queueName);

    // Create MessageQueue object and enable journal
    MessageQueue queue = new MessageQueue(queueName);
    queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
    queue.UseJournalQueue = true;
    Console.WriteLine($"queue.CanRead = {queue.CanRead}");
    Console.WriteLine($"queue.CanWrite = {queue.CanWrite}");

    // Send message
    queue.Send("test message");

    // Receive message from queue
    // The message is copied to the journal now
    Console.WriteLine($"queue.Receive(): {(string)queue.Receive().Body}");

    // Receive message again from journal
    MessageQueue journal = new MessageQueue(queueName + "\Journal$");
    journal.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
    Console.WriteLine($"journal.CanRead = {journal.CanRead}");
    Console.WriteLine($"journal.CanWrite = {journal.CanWrite}");
    Console.WriteLine($"journal.Receive(): {(string)journal.Receive().Body}");
}

这将创建一个新的消息队列并启用匹配的日志队列。发送的消息存储在消息队列中;收到后,将其移至日志队列。然后您可以再次从日志队列中收到此消息。

程序的输出是:

queue.CanRead = True
queue.CanWrite = True
queue.Receive(): test message
journal.CanRead = True
journal.CanWrite = False
journal.Receive(): test message