【问题标题】:WCF System.ServiceModel.Channel.Message: binary message contents (non-XML)?WCF System.ServiceModel.Channel.Message:二进制消息内容(非 XML)?
【发布时间】:2009-03-18 03:11:58
【问题描述】:

我需要在自定义 WCF LOB 适配器中检索二进制(非 XML)文档作为消息(供 BizTalk 使用)。消息需要表示为 System.ServiceModel.Channel.Message 的实例。

当内容是二进制时,我找不到如何创建此类的实例(“二进制”是指任意字节数组或流,而不仅仅是 XML 文档的二进制表示)。

这可能吗?或者将二进制内容包装在 XML 信封中是在 WCF 中执行此操作的唯一方法吗?

【问题讨论】:

  • +1 因为据我所知,Message 和 MessageEncoder 底层的所有内容都依赖于 XmlDictionaryWriter。当然,.NET 中的 StringMessage 之类的东西可以只接受一个字符串而不是 XML,但当然它标记为“内部密封”,就像 .NET 中所有有用的东西一样:(

标签: wcf biztalk


【解决方案1】:

从根本上说,WCF 消息是 XML,因为 S.S.C.Message 类使用 Xml InfoSet 作为基本消息表示。

所以,是的,您需要以某种方式将二进制内容“包装”到 XML 信封中(请注意,它不需要是 SOAP 信封,具体取决于您的绑定配置方式)。

也就是说,请注意,这并不排除流式处理在不将整个消息缓冲在内存中的情况下处理大型消息有效负载; WCF 仍然允许您执行此操作,尽管有时它的工作原理并不是很明显。

由于您使用的是自定义渠道,我认为您有以下两种选择之一:

  1. 让您自己的频道在您的二进制内容周围添加 XML 包装器,然后再向上传递或
  2. 创建一个自定义 MessageEncoder,它会自动为您添加。

在任何一种情况下,如果您要处理大型消息,您都需要确保使用处理 Streams 而不是缓冲区的 MessageEncoder 重载,因为它们可以让您选择与服务实现。

【讨论】:

    【解决方案2】:

    WCF 提供了一些方法来以各种方式发送二进制附件和流数据。我们有一个正在工作的应用程序可以做到这一点,但我没有机会深入研究代码,所以我无法提供太多帮助。以下是一些可以帮助您入门的链接(Nicholas Allen's Indigo Blog 是获取 WCF 信息的好地方):

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多