流式处理和 SAP 适配器
适用于 mySAP Business Suite 的 Microsoft BizTalk 适配器支持自身与客户端应用程序之间的消息流式处理。 通过 SAP 适配器调用操作,并通过交换 SOAP 消息返回响应。 SOAP 消息正文由 XML 节点组成。
适配器支持两种类型的消息流:
节点流式处理。 在节点流式处理中,消息可以在客户端和适配器之间一次流式传输节点。 这意味着,节点的整个值被读入缓冲区,然后发送到接收方。
节点值流式处理。 在节点值流中,节点的实际值可以在客户端和适配器之间以区块形式进行流式传输。 节点值流式处理对于使用 SendIdoc 或 ReceiveIdoc 操作发送或接收大型 IDOC 非常有用。 这是因为整个 IDOC 包含在单个节点中。 (与强类型发送或接收操作不同,在该操作中,IDOC 数据被分解为多个节点) 。
重要
仅在适配器和客户端应用程序之间支持节点值流式处理。 SAP 适配器不支持通过 SAP 系统进行端到端节点值流式处理。 这是因为 SAP 客户端库不支持此功能。
这两种流式处理模式都依赖于对 WCF 中消息的节点流式处理和节点值流式处理的支持。 因此,流式处理与适配器和客户端应用程序创建和使用消息的方式密切相关。 其一个结果是,在所有编程模型中,对消息流式处理的支持并不相同。
本主题中的部分提供:
有关 WCF 中如何支持消息流以及适配器如何实现消息流的基本背景信息。
有关在每个编程模型中使用适配器时如何支持消息流的信息。
流式处理基础知识
SAP 适配器实现的对流式处理的支持是以下各项的组合:
WCF 中的消息流式处理支持。
SAP 客户端库中的流式处理支持。
适配器在内部创建和使用消息的方式。
WCF 中的消息流式处理支持
WCF 如何支持对消息进行流式处理取决于消息的创建方式和使用消息的方式。
WCF 消息是使用 System.ServiceModel.Channels.Message 的静态 Create 方法创建的。 此方法具有多个重载,这些重载支持传递消息正文的不同方式。 可以通过使用以下方法传递消息正文来创建 WCF 消息:
System.Xml。XmlReader,或
System.ServiceModel.Channels.BodyWriter。
WCF 消息可以使用
通过调用Message.GetReaderAtBodyContents () 、 或
通过调用 Message.WriteBodyContents (XmlDictionaryWriter) 的 XmlDictionaryWriter。
下表显示了 WCF 对于创建和使用消息的不同组合的行为方式。
使用 创建的消息 | 消息使用 | WCF 行为 |
---|---|---|
XmlBodyWriter | XmlDictionaryWriter | 支持节点值流式处理。 WCF 通过管道将两个编写器一起启用流式处理。 XmlBodyWriter 和 XmlDictionaryWriter 都必须支持节点值流式处理才能发生。 |
XmlBodyWriter | XmlReader | 支持节点流式处理。 WCF 在内部缓冲 XmlReader。 |
XmlReader | XmlDictionaryWriter | 支持节点流式处理。 WCF 在内部缓冲 XmlReader 并调用回 XmlDictionaryWriter。 |
XmlReader | XmlReader | 支持节点流式处理。 WCF 在内部缓冲 XmlReader。 |
SAP 客户端库中的流式处理支持
SAP 客户端库不支持流式处理。 因此,SAP 适配器不支持端到端节点值流式处理。
适配器的内部消息处理
适配器支持以以下方式进行流式处理:
适配器使用通过使用 XmlDictionaryWriter 的自定义实现从客户端收到的 SendIdDoc 请求消息。 它使用 XmlReader 从客户端接收的所有其他消息。
适配器使用 XmlBodyWriter 的自定义实现创建发送到客户端的 ReceiveIdoc 请求消息。 它使用 XmlReader 创建发送到客户端的所有其他消息。
WCF 通道模型中的流式处理支持
下表提供有关 WCF 通道模型中如何支持流式处理的详细信息。
操作 | 节点流式处理 | Node-Value 流式处理 | 说明 |
---|---|---|---|
出站 RFC 和 BAPI 操作 (从客户端到适配器) | 不支持 | 不支持 | |
从客户端到适配器) (出站 tRFC 操作 | 不支持 | 不支持 | |
IDOC 发送操作 (强类型) | 不支持 | 不支持 | |
IDOC 接收操作 (强类型) | 支持 | 不支持 | |
sendIdoc 操作 (字符串) | 支持 | 支持 | 适配器使用 XmlDictionaryWriter 来使用请求消息。 如果客户端使用 BodyWriter 创建消息,则会发生从客户端到适配器的节点值流式处理。 |
ReceiveIdoc 操作 (字符串) | 支持 | 支持 | 适配器使用 BodyWriter 创建请求消息。 如果客户端使用 XmlDictionaryWriter 使用消息,则会发生从适配器到客户端的节点值流式处理。 |
入站 RFC 操作 | 不支持 | 不支持 | |
入站 tRFC 操作 | 不支持 | 不支持 |
有关如何在代码中实现节点值流式处理以使用 SendIdoc 和 ReceiveIdoc 操作发送和接收平面文件 (字符串) IDOC 的信息,请参阅 使用 WCF 通道模型在 SAP 中流 Flat-File IDOC。
WCF 服务模型中的流式处理支持
在消息的 XML 表示形式与该消息的托管代码对象表示形式之间序列化和反序列化需要将整个消息写入和读取到内存中。 因此,WCF 服务模型不支持节点流式处理和节点值流式处理。
BizTalk Server 中的流式处理支持
下表提供了BizTalk Server中如何支持流式处理的详细信息。
操作 | 节点流式处理 | Node-Value 流式处理 | 说明 |
---|---|---|---|
RFC 和 BAPI 操作 (从客户端到适配器) | 不支持 | 不支持 | |
tRFC 操作 (从客户端到适配器) | 不支持 | 不支持 | |
IDOC 发送操作 (强类型) | 不支持 | 不支持 | |
IDOC 接收操作 (强类型) | 支持 | 不支持 | |
sendIdoc 操作 (字符串) | 支持 | 支持 | WCF-Custom 适配器使用 BodyWriter 创建请求消息,因此支持节点值流式处理。 |
ReceiveIdoc 操作 (字符串) | 支持 | 支持 | WCF-Custom 适配器使用 XmlDictionaryWriter 来使用请求消息,因此支持节点值流式处理。 |
入站 RFC 操作 | 不支持 | 不支持 | |
入站 tRFC 操作 | 不支持 | 不支持 |