使用 WCF 服务模型在 SAP 中调用 RFC

适用于 mySAP Business Suite 的 Microsoft BizTalk 适配器将 SAP 系统上的 RFC 显示为可由客户端程序调用的操作。 在 WCF 服务模型中,这些操作作为生成的 WCF 客户端类的方法调用。 可以使用添加适配器服务引用 Visual Studio 插件生成 WCF 客户端类,该类包含要在代码中调用的每个 RFC 的方法。 添加适配器服务引用插件还会生成 .NET 类型,以封装每个 RFC 使用的参数和数据类型。 然后,可以创建此 WCF 客户端类的实例,并调用其方法来调用目标 RFC。

以下部分介绍如何使用 SAP 适配器在 SAP 系统上调用 RFC。

WCF 客户端类

SAP 适配器显示单个服务协定“Rfc”下的所有 RFC 操作。 这意味着为要调用的所有 RFC 操作创建单个 WCF 客户端类 RfcClient。 每个目标 RFC 表示为此类的方法。 在每个方法中:

  • SAP 导出参数显示为 输出 参数

  • SAP 更改参数显示为 ref 参数。

  • 复杂 SAP 类型(如结构)显示为 .NET 类,其属性与 SAP 类型的字段相对应。 这些类在以下命名空间中定义:microsoft.lobservices.sap._2007._03.Types.Rfc。

    以下代码显示了 RfcClient 类的一部分,以及调用 SAP 系统上SD_RFC_CUSTOMER_GET的方法。

 [System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class RfcClient : System.ServiceModel.ClientBase<Rfc>, Rfc {  
  
    ...  
  
    /// <summary>The metadata for this RFC was generated using the RFC SDK.</summary>  
    /// <param name="KUNNR">Customer number</param>  
    /// <param name="NAME1">Name of the customer</param>  
    /// <param name="CUSTOMER_T">Table of the selected customers</param>  
    /// <returns></returns>  
    public void SD_RFC_CUSTOMER_GET(string KUNNR, string NAME1, ref microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] CUSTOMER_T) {...}  
}  

如何创建 RFC 客户端应用程序

若要创建 RFC 客户端应用程序,请执行以下步骤。

创建 RFC 客户端应用程序

  1. 生成 RfcClient 类。 使用添加适配器服务参考 Visual Studio 插件或 ServiceModel 元数据实用工具 (svcutil.exe) 生成 一个 RfcClient 类,该类面向要使用的 RFC。 有关如何生成 WCF 客户端的详细信息,请参阅 为 SAP 解决方案项目生成 WCF 客户端或 WCF 服务协定

  2. 创建步骤 1 中生成的 RfcClient 类的实例,并指定客户端绑定。 指定客户端绑定涉及指定 RfcClient 将使用的绑定和终结点地址。 可以在代码中强制执行此操作,也可以在配置中以声明方式执行此操作。 有关如何指定客户端绑定的详细信息,请参阅 为 SAP 系统配置客户端绑定。 以下代码从配置初始化 RfcClient 并设置 SAP 系统的凭据。

    RfcClient rfcClient = new RfcClient("SAPBinding_Rfc");  
    
    rfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
    rfcClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. 打开 WCF 客户端。

    rfcClient.Open();  
    
  4. 调用在步骤 2 中创建的 RfcClient 上的方法,以在 SAP 系统上执行操作。 以下代码调用 RfcClient的 SD_RFC_CUSTOMER_GET 方法,以在 SAP 系统上调用 RFC。

    microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] customers =   
        new microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[0];  
    
    rfcClient.SD_RFC_CUSTOMER_GET(string.Empty, "AB*", ref customers);  
    
  5. 关闭 WCF 客户端。

    rfcClient.Close();   
    

示例

下面是一个完整的代码示例,它调用 SD_RFC_CUSTOMER_GET 返回名称以“AB”开头的客户列表,然后将每个客户的姓名和 ID 写入控制台。 此示例在 using 语句中创建 RfcClient。 无需显式关闭 RfcClient;当执行路径退出上下文时,它将关闭。

using System;  
using System.Collections.Generic;  
using System.Text;  
  
using System.ServiceModel;  
using Microsoft.ServiceModel.Channels;  
using Microsoft.Adapters.SAP;  
  
namespace SapRfcClientSM  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            try  
            {  
                // Create client from configuration  
                using (RfcClient rfcClient = new RfcClient("SAPBinding_Rfc"))  
                {  
  
                    rfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
                    rfcClient.ClientCredentials.UserName.Password = "YourPassword";  
  
                    // Open client  
                    rfcClient.Open();  
  
                    microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] customers = new microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[0];  
  
                    // Invoke SD_RFC_CUSTOMER_GET  
                    rfcClient.SD_RFC_CUSTOMER_GET(string.Empty, "AB*", ref customers);  
  
                    // Write the results to the console  
                    foreach (microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST customer in customers)  
                    {  
                        Console.WriteLine("Customer Name = " + customer.NAME1);  
                        Console.WriteLine("         Id   = " + customer.KUNNR);  
                        Console.WriteLine();  
                    }  
                }  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine(ex.Message);  
                if (ex.InnerException != null)  
                    Console.WriteLine("Inner exception is :" + ex.InnerException);  
            }  
        }  
    }  
}  

另请参阅

使用 WCF 服务模型开发应用程序
RFC 操作的消息架构