使用 SAP 适配器的 WCF 通道模型概述
若要在 SAP 系统上调用 RFC、TRFC 或 BAPI,或将 IDOCS 发送到 SAP 系统,代码将充当 WCF 客户端,并将出站操作发送到适配器。 在 WCF 通道模型中,代码通过通道发送请求消息来调用适配器上的操作。
若要充当 SAP 系统的 tRFC 或 RFC 服务器,代码将充当 WCF 服务。 也就是说,适配器对代码调用入站操作,例如 RFC 或 ReceiveIdoc 操作 (从 SAP 系统) 接收字符串格式的 IDOC。 在此方案中,代码从适配器通过通道接收操作的请求消息。
本节中的主题概述了将 SAP 适配器与 WCF 通道模型配合使用。
WCF 通道模型概述
客户端和服务通过交换 SOAP 消息进行通信。 WCF 通道模型是此消息交换的低级抽象。 它提供接口和类型,使你能够使用称为通道堆栈的分层协议堆栈发送和接收消息。 堆栈的每一层由一个通道组成,每个通道都是从 WCF 绑定创建的。 最低层是传输通道。 传输通道在服务和客户端之间实现基础传输机制,并将每条消息呈现给更高层 (,最终使用的应用程序) 作为 System.ServiceModel.Message。 WCF Message 类是 SOAP 消息的抽象。 WCF 提供了多个通道接口(称为通道形状),这些接口对基本 SOAP 消息交换模式(如请求-答复或单向)进行建模。 WCF 传输绑定提供一个或多个通道形状的实现,较高层可以使用这些形状发送和接收消息。 有关 WCF 通道模型的详细信息,请参阅 通道模型概述。
SAP 适配器是一个 WCF 自定义传输绑定,将 SAP 系统公开为 WCF 服务。
SAP 适配器支持的通道形状
适配器实现以下 WCF 通道形状:
IRequestChannel (System.ServiceModel.Channels.IRequestChannel) 。 IRequestChannel 接口实现请求-答复消息交换的客户端。 可以使用 IRequestChannel 执行想要使用响应的操作,例如在 SAP 系统上调用返回数据的 RFC。
IOutputChannel (System.ServiceModel.Channels.IOutputChannel) 。 此形状实现单向消息交换的客户端。 可以使用 IOutputChannel 调用不需要对其使用响应的操作,例如在 SAP 系统上调用不返回任何数据的 RFC。
IReplyChannel (System.ServiceModel.Channels.IReplyChannel) 。 此形状实现请求-答复消息交换的服务端。 可以使用 IReplyChannel 实现 RFC 或 tRFC 服务器,或者从 SAP 系统接收 IDOC。
与任何 WCF 绑定一样,SAP 适配器使用工厂模式向应用程序代码提供通道。 使用 Microsoft.Adapters.SAPBinding 对象创建以下项的实例:
System.ServiceModel.ChannelFactory<IRequestChannel> 提供 IRequestChannel 通道,可用于在适配器上调用请求-响应操作。
System.ServiceModel.ChannelFactory<IOutputChannel> 提供 IOutputChannel 通道,可用于在适配器上调用单向操作。
System.ServiceModel.IChannelListener<IReplyChannel> 提供 IReplyChannel 通道,可用于从适配器接收请求-响应操作。
在 WCF 通道模型中为 SAP 适配器创建消息
在 WCF 中, System.ServiceModel.Channels.Message 类提供 SOAP 消息的内存中表示形式。 通过调用静态 Message.Create 方法创建 Message 实例。
SOAP 消息有两个重要部分,在构造要发送到 SAP 适配器 的消息 实例时,必须指定这两个部分。
消息操作是一个字符串,它是 SOAP 消息标头的一部分。 消息操作标识应在 SAP 适配器上调用的操作。 下面显示了指定用于在 SAP 系统上调用SD_RFC_CUSTOMER_GET RFC 的消息操作:
http://Microsoft.LobServices.Sap/2007/03/Rfc/SD_RFC_CUSTOMER_GET
。消息正文包含操作的参数数据。 消息正文由格式正确的 XML 组成,这些 XML 对应于 SAP 适配器针对请求的操作所需的消息架构。 以下消息正文包含 SAP 系统上SD_RFC_CUSTOMER_GET RFC 的参数。
<SD_RFC_CUSTOMER_GET xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Rfc/\"> <KUNNR i:nil=\"true\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"> </KUNNR> <NAME1>AB*</NAME1> <CUSTOMER_T> </CUSTOMER_T> </SD_RFC_CUSTOMER_GET>
有关 SAP 适配器消息架构和操作的消息操作的信息,请参阅适用于 mySAP Business Suite 的 BizTalk 适配器的消息和消息架构。
Message.Create 方法重载,并提供许多不同的选项来提供消息正文。 以下代码演示如何使用System.Xml 创建 Message 实例 。用于 提供消息正文的 XmlReader。 在此代码中,从字符串常量读取消息正文。
//create an XML message to send to the SAP system
//We are invoking the SD_RFC_CUSTOMER_GET RFC.
//The XML below specifies that we want to search for customers with names starting with "AB"
string inputXml = "<SD_RFC_CUSTOMER_GET xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Rfc/\"> <KUNNR i:nil=\"true\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"> </KUNNR> <NAME1>AB*</NAME1> <CUSTOMER_T> </CUSTOMER_T> </SD_RFC_CUSTOMER_GET>";
//create an XML reader from the input XML
XmlReader reader = XmlReader.Create(new MemoryStream(Encoding.Default.GetBytes(inputXml)));
//create a WCF message from the XML reader
Message inputMessge = Message.CreateMessage(MessageVersion.Soap11, "http://Microsoft.LobServices.Sap/2007/03/Rfc/SD_RFC_CUSTOMER_GET", reader);
重要
必须在 Message 实例中提供 消息 操作。 这通常在创建 Message 实例时完成。
WCF 通道模型中 SAP 适配器上的流式处理支持
如何创建和使用与 SAP 适配器交换的消息决定了消息在代码和适配器之间流式传输的方式。
节点流式处理
节点流式处理是除 SendIdoc 和 ReceiveIdoc 操作之外的所有操作支持的唯一流式处理级别。
若要对消息执行节点流式处理,需要:
使用 XmlReader 创建出站消息,以提供消息正文。
使用 XmlReader 使用入站消息。 通过对入站消息调用 GetReaderAtBodyContents 方法获取读取器。
节点值流式处理
由于 SendIdoc 和 ReceiveIdoc 操作在单个 XML 节点 (<idocData>) 下的字符串中包含 IDOC 数据,因此适配器支持对这些操作进行节点值流式处理。
若要为这些操作执行节点值流式处理,可以:
使用实现节点值流式处理以提供消息正文的 BodyWriter 创建 SendIdoc 请求消息 (出站) 。
通过使用实现节点值流式处理 (的 XmlDictionaryWriter 对消息调用 WriteBodyContents 方法,使用 ReceiveIdoc 请求消息 (入站) 。
有关使用 WCF 通道模型流式处理平面文件 (字符串) IDOC 的详细信息,请参阅 使用 WCF 通道模型的流式处理 Flat-File SAP 中的IDOC。