使用 BizTalk Server 从 SAP 接收 RFC 函数调用

在 RFC 服务器方案中,有三个实体:

  • 向 SAP 发送请求以调用 RFC 的 SAP 客户端。 这可以通过使用 SAP GUI 或通过 SAP 适配器进行 RFC 客户端调用来调用。

  • 包含 SAP 客户端调用的 RFC 函数定义的 SAP 系统。 SAP 系统将请求传递给 RFC 服务器(适配器)。 适配器使用此元数据以获取 SAP 服务器对适配器进行的 RFC 调用的信息。

  • 充当 RFC 服务器并托管实际 RFC 的 SAP 适配器。

    本主题未讨论第一个实体 SAP 客户端。 如果使用 SAP GUI 调用 RFC,请参阅 SAP 文档。 如果使用 SAP 适配器调用 RFC,请参阅 使用 BizTalk Server 调用 SAP 中的 RFC

    本部分提供有关在 SAP 客户端调用 RFC 后如何使用适配器接收 RFC 服务器调用的说明。 有关适配器如何通过 SAP 适配器支持接收 RFC 服务器调用的详细信息,请参阅 SAP 中的 RFC 操作

如何从 SAP 系统接收入站 RFC 呼叫?

使用 BizTalk Server 在 SAP 系统上执行操作涉及按照构建 SAP 应用程序所需模块所述的过程任务。 若要从 SAP 系统接收 RFC 调用,这些任务包括:

  1. 将 SAP 系统配置为将 RFC 发送到外部应用程序,在本例中为 SAP 适配器。

  2. 创建 BizTalk 项目,并为 SAP 适配器接收自 SAP 系统的 RFC 生成相应架构。

  3. 在 BizTalk 项目中创建消息,以便从 SAP 系统接收消息并发送响应。

  4. 创建业务流程以从 SAP 系统接收 RFC,对其进行处理,并将响应发送到 SAP 系统。

  5. 生成和部署 BizTalk 项目。

  6. 通过创建物理发送和接收端口来配置 BizTalk 应用程序。

  7. 启动 BizTalk 应用程序。

    本主题提供执行这些任务的说明。

SAP 系统上的活动

在使用 SAP 适配器接收从 SAP 系统传入的 RFC 调用之前,请确保在 SAP 系统上完成以下任务。

  • SAP 适配器的 RFC 目标必须存在。 SAP 适配器通过 SAP 系统上定义的 RFC 目标从 SAP 系统接收 RFC。 RFC 目标包含 SAP 网关主机、SAP 网关服务和必须在代码中的连接 URI 中指定的 SAP 计划 ID。 有关如何在 SAP 上设置 RFC 目标的信息,请参阅 创建 RFC、RFC 目标以及从 SAP 系统发送 RFC

  • 必须创建定义 SAP 系统上 RFC 的函数模块。 SAP 适配器使用 SAP 系统上的 RFC 定义来检索有关 RFC(在设计时和运行时)的元数据。 有关详细信息,请参阅 在 SAP 系统中创建 RFC

    下面是一个在 SAP 系统上用于将两个整数相加并返回其结果的 RFC 源代码示例。 代码仅通过指定目标调用 RFC。 函数的实现由 SAP 适配器客户端代码完成。

    FUNCTION Z_RFC_ADD.  
    *"------------------------------------------------------------------  
    *"  
    *"Local interface:  
    *"  IMPORTING  
    *"     VALUE(X) TYPE  INT4  
    *"     VALUE(Y) TYPE  INT4  
    *"     VALUE(DEST) TYPE  CHAR20 DEFAULT 'SAPADAPTER'  
    *"  EXPORTING  
    *"     VALUE(RESULT) TYPE  INT4  
    *"------------------------------------------------------------------  
    CALL FUNCTION 'Z_RFC_ADD' DESTINATION DEST  
      EXPORTING X = X  
                Y = Y  
      IMPORTING RESULT = RESULT.  
    
    ENDFUNCTION.  
    

基于本主题的示例

基于本主题的示例 RFCServer 也随 BizTalk 适配器包一起提供。 有关详细信息,请参阅 SAP 适配器的示例

生成架构

在本主题中,为了演示如何从 SAP 系统接收入站 RFC 调用,我们将生成 Z_RFC_ADD RFC 的架构。 在上一步中创建了此 RFC。 此 RFC 采用两个整数值作为输入参数。

有关如何为特定 RFC 生成架构的说明,请参阅 浏览、搜索,以及获取 SAP 中的 RFC 操作元数据

重要

由于要为入站 RFC 调用生成架构,请确保在“使用适配器服务 BizTalk 项目外接程序”中,从“选择协定类型”下拉列表中选择“服务”(入站操作)

定义消息和消息类型

前面生成的架构描述了业务流程中消息所需的“类型”。 消息通常是变量,类型由相应的架构定义。 必须将在第一步中生成的架构链接到 BizTalk 项目的业务流程视图中的消息。

对于本主题,必须创建两条消息-一个用于从 SAP 系统接收消息,另一条消息用于向 SAP 系统发送响应。

执行以下步骤创建消息并将其链接到架构:

  1. 向 BizTalk 项目添加新的编排。

  2. 如果尚未打开,请打开 BizTalk 项目的编排视图。 单击“视图”,指向“其他窗口”,然后单击“编排视图”

  3. 业务流程视图中,右键单击 “消息”,然后单击“ 新建消息”。

  4. 右键单击新创建的消息,然后选择“ 属性”窗口

  5. Message_1“属性”窗格中,执行以下作。

    用这个 要执行的操作
    标识符 键入 请求
    消息类型 从下拉列表中,展开 Schemas,然后选择 RFCServer.SAPBindingSchema.Z_RFC_ADD,其中 RFCServer 是您 BizTalk 项目的名称。 SAPBindingSchema 是为 RFC Z_RFC_ADD生成的架构。
  6. 重复步骤 2 以创建新消息。 在新消息的 “属性 ”窗格中,执行以下作。

    用这个 要执行的操作
    标识符 键入 响应
    消息类型 在下拉列表中,展开 “架构”,然后选择 RFCServer.SAPBindingSchema.Z_RFC_ADDResponse

设置业务流程

必须创建一个 BizTalk 业务流程,以使用 BizTalk Server 从 SAP 系统接收 RFC 服务调用。 对于此示例,请考虑 RFC 客户端向 SAP 系统发送请求以添加两个整数的情况。 SAP 系统使用输入参数获取请求,并将其传递给 SAP 适配器托管的外部 RFC 服务器。 SAP 适配器从 SAP 系统接收请求,处理请求以添加两个整数,并生成响应。 SAP 适配器将响应传递给 SAP 系统,而 SAP 系统又传递到 RFC 客户端。

要在编排中实现这一点,编排必须包含:

  • 一个双向接收端口,用于从 SAP 系统接收 RFC 服务器请求并发送响应。

  • 发送和接收图形。

  • 构造消息形状,并在该消息分配形状中处理来自 SAP 系统的 RFC 服务器请求。

    RFC 服务器调用的示例编排如下所示。

    业务流程用于使 RFC 服务器调用

添加消息形状

请确保为每个邮件形状指定以下属性。 Shape列中列出的名称是前述编排中显示的消息形状名称。

形状 形状类型 性能
ListenToSAP 接收 - 将 名称 设置为 ListenToSAP
- 将 “激活 ”设置为 True
SendResponse 发送 - 将 名称 设置为 SendResponse

添加构建信息格式

若要处理传入的RFC调用以合并两个整数值,您需要在两个发送形状之间的业务流程中添加一个"构造消息"形状,并在其中添加"消息分配"形状。 对于此示例,消息分配形状调用以添加两个整数。 消息分配组件还设置要发送到 SAP 系统的响应的动作。

对于“构造消息”形状,请将 Message Constructed 属性设置为 “响应”。

处理 RFC 请求的代码可以是与 BizTalk 项目相同的 Visual Studio 解决方案的一部分。 用于添加两个整数的示例代码如下所示。

namespace RFCServerResponseCreator  
{  
    public class RFCServerResponseCreator  
    {  
        private static XmlDocument messageIn;  
        private static XmlDocument messageOut;  
        public static XmlDocument CreateRequest(int a, int b, string destination)  
        {  
            messageIn = new XmlDocument();  
            messageIn.LoadXml(  "<Z_RFC_ADD xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Rfc/\">" +  
                                "<DEST>" + destination + "</DEST>" +  
                                "<X>" + a + "</X>" +  
                                "<Y>" + b + "</Y>" +   
                                "</Z_RFC_ADD>"  
                             );  
            return messageIn;  
        }  
        public static XmlDocument CreateResponse(int a, int b)  
        {  
            int c = a + b;  
            messageOut = new XmlDocument();  
            messageOut.LoadXml( "<Z_RFC_ADDResponse xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Rfc/\">" +  
                                "<RESULT>" + c + "</RESULT>" +   
                                "</Z_RFC_ADDResponse>"  
                              );  
            return messageOut;  
        }  
    }  
}  

注释

生成项目后,将在项目目录中创建 RFCServerResponseCreator.dll。 必须将此 DLL 添加到全局程序集缓存(GAC)。

添加以下表达式,以便从消息分配形状调用此代码,并设置发送到 SAP 系统的响应的操作。 若要添加表达式,请双击“消息分配”形状以打开表达式编辑器。

Response = RFCServerResponseCreator.RFCServerResponseCreator.CreateResponse(Request.X, Request.Y);  
Response(WCF.Action) = "http://Microsoft.LobServices.Sap/2007/03/Rfc/Z_RFC_ADD/response";  

重要

必须在响应消息中显式设置动作。 如果未设置操作,WCF-Custom 适配器通过将“响应”追加到请求操作来生成操作消息。 因此,响应消息的操作将变为 http://Microsoft.LobServices.Sap/2007/03/Rfc/Z_RFC_ADDResponse。 但是,sapBinding 期望通过在请求动作后附加 "/response" 来获得响应,例如 http://Microsoft.LobServices.Sap/2007/03/Rfc/Z_RFC_ADD/response

添加端口

请确保为逻辑端口指定以下属性。 列在端口栏中的名称是编排中显示的端口名称。

港口 性能
RFCServerPort - 将 标识符 设置为 RFCServerPort
- 将 类型 设置为 RFCServerPortType
- 将 通信模式 设置为 请求-响应
- 将 通信方向 设置为 接收-发送

为动作形状指定消息并连接至端口

下表指定要设置的属性及其值,以针对动作形状指定消息并将其连接到端口。 Shape列中列出的名称是前述编排中显示的消息形状名称。

形状 性能
ListenToSAP - 将 消息 设置为 请求
- 将 操作 设置为 RFCServerPort.Add.Request
SendResponse - 将 消息 设置为 FuncResponse
- 将 操作 设置为 RFCServerPort.Add.Response

指定这些属性后,消息形状符和端口被连接,您的编排已完成。

现在必须生成 BizTalk 解决方案,然后将其部署到 BizTalk Server。 有关详细信息,请参阅 生成和运行业务流程

配置 BizTalk 应用程序

部署 BizTalk 项目后,前面创建的业务流程将列在 BizTalk Server 管理控制台中的 “业务流程 ”窗格下。 必须使用 BizTalk Server 管理控制台来配置应用程序。 有关配置应用程序的详细信息,请参阅 如何配置应用程序

配置应用程序涉及:

  • 为应用程序选择主机。

  • 将业务流程中创建的端口映射到 BizTalk Server 管理控制台中的物理端口。 对于此编排,必须:

    • 定义 WCF-Custom 或 WCF-SAP 接收端口。 此端口将从 SAP 系统接收入站 RFC 调用,并将响应发送回 SAP 系统。 有关如何创建端口的信息,请参阅 手动配置到 SAP 适配器的物理端口绑定

      注释

      使用适配器服务 BizTalk 项目插件生成架构时,还会创建一个绑定文件,其中包含有关端口和为这些端口设置的操作的信息。 可以从 BizTalk 管理控制台导入此绑定文件,以创建发送端口(用于出站呼叫)或接收端口(对于入站呼叫)。 有关详细信息,请参阅 使用端口绑定文件配置到 SAP 的物理端口绑定

    还必须将 RFCServerResponseCreator 项目的程序集添加到 BizTalk 应用程序。 你创建了此项目来处理从 SAP 系统收到的 RFC 调用。 为此,做以下事情:

  1. 在 BizTalk Server 管理控制台左侧的控制台树中,在导入绑定的 BizTalk 应用程序下,右键单击 “资源”,指向 “添加”,然后单击 “BizTalk 程序集”。

  2. 在“ 添加资源 ”对话框中,单击“ 添加”,然后导航到包含 RFCServerResponseCreator.dll的文件夹。 选择文件,然后单击“ 打开”。

  3. 在“ 添加资源 ”对话框中,单击“ 确定”。

启动应用程序

必须启动 BizTalk 应用程序以接收来自 SAP 系统的入站 RFC 调用。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程以及如何 启动应用程序

在此阶段,请确保:

  • WCF-Custom 或 WCF-SAP 接收端口正在运行,用于从 SAP 系统接收 RFC 调用。

  • 正在运行该操作的 BizTalk 业务流程。

执行操作

运行应用程序后,必须将 RFC 发送到 SAP 适配器。 为此,可以在 SAP 系统上执行事务 SE37。 还必须指定 RFC 调用的输入参数。 适配器会随参数一起接收调用,对其进行处理,并将响应发送回 SAP 系统。 你将能够在发送 RFC 请求的同一个事务中看到响应。

可能的异常

有关使用 BizTalk Server 从 SAP 系统接收 RFC 服务器调用时可能会遇到的异常的信息,请参阅 SAP 适配器的异常和错误处理

最佳做法

部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,以便无需为同一业务流程创建发送端口、接收端口等。 有关绑定文件的详细信息,请参阅 重复使用 SAP 适配器绑定

另请参阅

开发 BizTalk 应用程序