【问题标题】:How to receive xml message from MSMQ private queue in C# sent by BizTalk MSMQ adapter如何从 BizTalk MSMQ 适配器发送的 C# 中的 MSMQ 私有队列接收 xml 消息
【发布时间】:2020-04-13 00:21:08
【问题描述】:

我使用 BizTalk 2016 并在 BizTalk MSMQ 适配器(主体类型 8209)中配置了默认设置。

我正在尝试从 c# 代码接收消息,但收到以下异常:

“System.InvalidOperationException”类型的未处理异常 发生在 System.Messaging.dll 中

附加信息:无法反序列化作为 争论。无法识别序列化格式。

使用的代码(精简):

message = messageQueue.Receive();
message.Formatter = new ActiveXMessageFormatter();
document.Load(message.Body.ToString());

访问消息的Body属性时抛出异常,触发格式化程序访问消息内容。

我尝试指定格式化程序,并尝试了几种不同的类型,但它们都不起作用。我担心数据上有一些字节顺序标记,需要手动删除。真的是这样吗?

我认为这种需求很普遍,卡在这上面很奇怪......!?请让我走上正轨!

【问题讨论】:

    标签: biztalk msmq


    【解决方案1】:

    最终使用了 XmlDocument,它处理了 BOM 和所有内容:

    XmlDocument document = new XmlDocument();
    document.Load(message.BodyStream);
    

    这种情况下我不需要 MessageFormatter。 :)

    【讨论】:

      【解决方案2】:

      不使用 XmlDocument 的替代解决方案。技巧是使用 BodyStream 来避免初始化任何格式化程序:

      MessageQueue messageQueue = new MessageQueue(@".\private$\test");
      
      System.Messaging.Message message = new System.Messaging.Message();
      message.BodyType = 8209;
      message = messageQueue.Receive();
      
      using (FileStream fileStream = File.Create(@"C:\TEMP\output.xml"))
      {
        message.BodyStream.Seek(0, SeekOrigin.Begin);
        message.BodyStream.CopyTo(fileStream);
      }
      

      此代码使用带有特殊字符的 UTF-8 作为输入/输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 2014-07-29
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 2011-07-08
        相关资源
        最近更新 更多