【问题标题】:Send XML message to MSMQ without any formatting将 XML 消息发送到 MSMQ,无需任何格式
【发布时间】:2020-12-12 15:06:17
【问题描述】:

我需要向 MSMQ 发送一个 XMLDocument 对象。我没有将其反序列化为的类(xml 可能会有所不同)。默认格式化程序 XMLMessageFormatter 将“漂亮地打印”对象。这会导致一个问题,因为

<text></text>

将转换为

<text>

</text>

(即 cr + 空格)。该消息正在由使用默认 XMLMessageFormatter 的进程读取,并且在节点中有数据时没有问题。然而,这是一个问题,因为进程(我无法控制)会将这些新字符解释为数据并导致错误。

我知道我可以编写一些代码来使用 IsEmpty = true 将它们转换为<text />,但我想要一个完全不改变对象的解决方案。

BinaryMessageFormatter 将在数据前面加上 BOM 数据(接收方不希望这样),ActiveXMessageFormatter 会将字符串加倍字节(再次导致另一端出现问题)。

我宁愿避免编写自定义消息格式化程序。我尝试在 XMLMessageFormatter 中包含一些选项,但效果不大。任何想法都将不胜感激。

【问题讨论】:

    标签: c# xml msmq


    【解决方案1】:

    MSMQ 对原始 blob 进行操作。除非您愿意,否则您不必使用格式化程序。

    要发送消息并逐字节返回,请使用BodyStream property.

    例子:

    var queue = new MessageQueue(@".\private$\queueName");
    var msg = new Message();
    msg.BodyStream = new MemoryStream(Encoding.UTF8.GetBytes("<root><test></test></root>"));
    queue.Send(msg);
    

    结果消息:

    【讨论】:

    • 不幸的是,默认情况下未指定格式化程序会应用 XmlMessageFormat,尽管文档建议即使使用 BodyStream 也是如此。所以&lt;root&gt;&lt;test&gt;&lt;/test&gt;&lt;/root&gt; 的结果是&lt;root&gt;.. &lt;test&gt;.. &lt;/test&gt;..&lt;/root&gt;(插入了CR 和空格)
    • @StephenMaitland,我无法重现这种行为。我在答案中添加了示例代码 - 如果您使用 BodyStreamBodyFormatter 将被忽略。
    • 啊,谢谢,我没有使用字节数组。标记为已接受。
    猜你喜欢
    • 2012-02-12
    • 2023-03-07
    • 2012-05-20
    • 2010-10-16
    • 2010-12-27
    • 1970-01-01
    • 2018-02-02
    • 2013-06-24
    • 2023-03-26
    相关资源
    最近更新 更多