使用 WCF 服務模型在 SAP 中叫用 RFC
Microsoft BizTalk Adapter for mySAP Business Suite 會將 SAP 系統上的 RFC 顯示為用戶端程式可叫用的作業。 在 WCF 服務模型中,這些作業會叫用為所產生 WCF 用戶端類別的方法。 您可以使用 [新增配接器服務參考 Visual Studio 外掛程式] 來產生 WCF 用戶端類別,其中包含您要在程式碼中叫用之每個 RFC 的方法。 新增配接器服務參考外掛程式也會產生 .NET 類型,以封裝每個 RFC 所使用的參數和資料類型。 然後,您可以建立這個 WCF 用戶端類別的實例,並呼叫其方法來叫用目標 RFC。
下列各節說明如何使用 SAP 配接器在 SAP 系統上叫用 RFC。
WCF 用戶端類別
SAP 配接器會在單一服務合約 「Rfc」 下呈現所有 RFC 作業。 這表示會針對您想要叫用的所有 RFC 作業建立單一 WCF 用戶端類別 RfcClient。 每個目標 RFC 都會以這個類別的方法表示。 在每個方法中:
SAP 匯出參數會呈現為 out 參數
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 用戶端應用程式
產生 RfcClient 類別。 使用新增配接器服務參考 Visual Studio 外掛程式或 ServiceModel 中繼資料公用程式工具 (svcutil.exe) ,產生以您想要運作之 RFC 為目標的 RfcClient 類別。 如需如何產生 WCF 用戶端的詳細資訊,請參閱 產生 WCF 用戶端或 SAP 解決方案成品的 WCF 服務合約。
建立步驟 1 中產生的 RfcClient 類別實例,並指定用戶端系結。 指定用戶端系結牽涉到指定 RfcClient 將使用的系結和端點位址。 您可以在程式碼中以命令方式執行此動作,或在組態中以宣告方式執行此動作。 如需如何指定用戶端系結的詳細資訊,請參閱 設定 SAP 系統的用戶端系結。 下列程式碼會從組態初始化 RfcClient ,並設定 SAP 系統的認證。
RfcClient rfcClient = new RfcClient("SAPBinding_Rfc"); rfcClient.ClientCredentials.UserName.UserName = "YourUserName"; rfcClient.ClientCredentials.UserName.Password = "YourPassword";
開啟 WCF 用戶端。
rfcClient.Open();
在步驟 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);
關閉 WCF 用戶端。
rfcClient.Close();
範例
以下是叫用SD_RFC_CUSTOMER_GET的完整程式碼範例,以傳回名稱開頭為 「AB」 的客戶清單,然後將每個客戶的名稱和識別碼寫入主控台。 此範例會在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);
}
}
}
}