【问题标题】:How do I stop my System.Messaging.MessageQueue from wrapping my strings in XML?如何阻止我的 System.Messaging.MessageQueue 将我的字符串包装在 XML 中?
【发布时间】:2010-10-30 13:23:25
【问题描述】:

我需要通过 Windows 消息队列从我的 C# 应用程序与旧应用程序通信。

旧版应用程序需要在特定私有队列中发送纯字符串消息,但我似乎无法阻止 System.Messaging.MessageQueue 将我的消息包装在 XML 中!

我测试的代码很简单:

MessageQueue myQueue = new MessageQueue(@".\Private$\tolegacy");
Message msg = new Message("My Test String");
myQueue.Send(msg);

问题是消息正在被 XML 序列化并在队列中显示为:

<?xml version="1.0"?><string>My Test String</string>

我无法修改旧版应用程序的行为,因此我需要阻止 System.Messaging.MessageQueue 将我的消息格式化为 XML。

谁能帮忙?

【问题讨论】:

    标签: c# .net xml-serialization msmq


    【解决方案1】:

    您可以创建自己的格式化程序(它是一个实现 IMessageFormatter 并将其分配给 Message 的 Formatter 属性的类

    这是一个link 到 MSDN 到 Message.Formatter 属性。

    我还没有尝试过,但您应该可以使用 BodyStream 编写您的消息,我相信这将绕过格式化程序。

    【讨论】:

    • 直接写入 BodyStream 有效,谢谢。它看起来是最简单的更改,所以我先尝试了 :)
    • 我自己写了几个,而且效果很好。您唯一需要担心的是发送者和接收者了解身体类型。
    • 我们遇到了类似的问题。我们可以读/写队列并很好地取回消息。但是当供应商读取队列时,他会看到包裹在我们的消息周围的额外“东西”。我们怎么能只写一个没有包装的简单字符串呢?甚至 BinaryFormatter 在字符串的开头添加了一堆字节。
    • 答案是 - 删除所有格式化程序 - MemoryStream myStream = new MemoryStream(System.Text.encoding.ASCII.GetBytes(myString); msg.BodyStream = myStream; Q.Send(msg);
    • 为了纠正@NealWalters 上述评论中的一些错误,它是using System.Text; 然后var memStream = new MemoryStream(Encoding.ASCII.GetBytes(myString)); 然后var msg = new Message { BodyStream = memStream }; 然后Q.Send(msg);
    【解决方案2】:

    使用ActiveXMessageFormatter 将为您提供所需的结果。我们只是想将一个字符串传递给一个队列并让侦听器进程作为字符串在正文中读取时遇到了同样的问题。 ActiveXMessageFormatter 用于序列化/反序列化原始数据类型,不会像默认的 XmlMessageFormatter 那样在您的输入中放置 XML 包装器。

    mq.Formatter = new ActiveXMessageFormatter();
    

    Here 是另一个链接,也描述了 3 种不同的格式化程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多