使用 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.  
    

基于本主题的示例

BizTalk 适配器包还提供了基于本主题的示例 RFCServer。 有关详细信息,请参阅 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的“属性”窗格中,执行以下操作。

    使用此选项 要执行此操作
    标识符 键入 “请求”。
    消息类型 在下拉列表中,展开“ 架构”,然后选择“ 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 系统的响应的操作。

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

处理 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
- 将 Type 设置为 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 应用程序的说明,请参阅 如何启动业务流程如何启动应用程序

在此阶段,请确保:

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

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

执行操作

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

可能的异常

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

最佳实践

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

另请参阅

开发 BizTalk 应用程序