使用 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)生成面向要使用的 RFC 的 RfcClient 类。 有关如何生成 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 系统执行操作。 以下代码调用 RfcClientSD_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操作的消息模式