使用 SAP 配接器的 WCF 服務模型概觀
當您取用 Microsoft BizTalk Adapter for mySAP Business Suite 介面的作業時,您的程式碼會做為配接器的用戶端或服務。
您的程式碼可作為用戶端,以叫用 SAP 系統上的下列作業類型:
叫用遠端函式呼叫 (RFC) 。
叫用交易式遠端函式呼叫 (tRFC) 。
叫用商務應用程式程式設計介面 (BAPI) 。
傳送中繼檔 (IDOC)
您的程式碼會作為服務來接收下列類型的作業:
接收 RFC (RFC 伺服器)
接收 tRFC (tRFC 伺服器)
接收 IDOC。
注意
由於 BAPIs 是由位於 Business Object Repository (BOR) 之商務物件上的 SAP 系統所公開的方法,因此您無法接收 BAPIs。
在 Windows Communication Foundation (WCF) 服務模型中,用戶端與服務之間的服務合約會以 .NET 介面表示,而作業則會以這個介面上的方法表示。 SAP 配接器和 WCF 提供工具,可讓您從配接器公開的中繼資料產生此介面以進行目標作業。 這些工具也會建立 WCF 用戶端類別,可用來叫用服務介面中公開的作業。 用戶端應用程式可以呼叫 WCF 用戶端類別的方法,以叫用配接器上的作業。 若要實作服務以從 SAP 配接器接收作業,您可以實作針對目標作業產生的介面。
下列各節說明如何使用 WCF 服務模型來建立 SAP 配接器的用戶端和服務程式代碼。
在 SAP 上建立 WCF 用戶端和叫用作業
若要使用 WCF 服務模型在 SAP 配接器上叫用作業,您必須先產生目標作業的 WCF 用戶端類別。 然後,您可以建立這個類別的實例 WCF 用戶端,並呼叫其方法來在 SAP 系統上執行作業。
在 SAP 配接器上叫用作業
產生 WCF 用戶端類別和協助程式程式碼。 使用 [新增配接器服務參考 Visual Studio 外掛程式] 或 ServiceModel 中繼資料公用程式工具 (svcutil.exe) ,產生以您想要運作之 SAP 系統成品為目標的 WCF 用戶端類別。 如需如何產生 WCF 用戶端的詳細資訊,請參閱 產生 WCF 用戶端或 SAP 解決方案成品的 WCF 服務合約。
藉由指定用戶端系結來建立 WCF 用戶端實例。 指定用戶端系結牽涉到指定 WCF 用戶端將使用的系結和端點位址。 您可以在程式碼中以命令方式執行此動作,或在組態中以宣告方式執行此動作。 如需如何指定用戶端系結的詳細資訊,請參閱 設定 SAP 系統的用戶端系結。 下列程式碼會建立 WCF 用戶端,可用來在 SAP 系統上叫用 RFC。 它也會設定 SAP 系統的認證。 WCF 用戶端會從組態初始化。
RfcClient rfcClient = new RfcClient("SAPBinding_Rfc"); rfcClient.ClientCredentials.UserName.UserName = "YourUserName"; rfcClient.ClientCredentials.UserName.Password = "YourPassword";
開啟 WCF 用戶端。
rfcClient.Open();
在步驟 2 中建立的 WCF 用戶端上叫用方法,以在 SAP 系統上執行作業。 下列程式碼會叫用 WCF 用戶端 的 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();
使用 SAP 配接器建立和實作 WCF 服務
若要使用 WCF 服務模型從 SAP 配接器接收作業,您必須先產生 .NET 介面 (也稱為 WCF 服務合約) ,代表 SAP 配接器針對作業公開的服務合約。 如需如何執行這項操作的詳細資訊,請參閱 產生 WCF 用戶端或 SAP 解決方案成品的 WCF 服務合約。
接著,您可以實作產生的介面來實作 WCF 服務。 這個類別包含處理作業的商務邏輯,並傳回配接器的回應。 然後使用服務主機 (System.ServiceModel.ServiceHost) 來裝載此服務的實例。
建立及實作 WCF 服務
產生 WCF 服務合約和協助程式類別。 使用 [新增配接器服務參考外掛程式] 或 [svcutil.exe] 來產生 WCF 服務合約 (介面,) 以您想要使用的 SAP 系統成品為目標。 如需如何產生 WCF 用戶端的詳細資訊,請參閱 產生 WCF 用戶端或 SAP 解決方案成品的 WCF 服務合約。
從步驟 1 中產生的介面和協助程式類別實作 WCF 服務。 如果發生錯誤處理作業的資料,處理該作業的方法可能會擲回例外狀況,以將錯誤傳回至 SAP 系統;否則,方法必須傳回作業所產生之適當 () 回應類別的實例。 您必須屬性 WCF 服務類別,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
如果您使用 [新增配接器服務參考外掛程式] 來產生介面,您可以在產生的 SAPBindingService 類別中直接在適當的方法中實作邏輯。 您可以在 SAPBindingService.cs 中找到這個類別。 下列程式碼子類別是 SAPBindingService 類別。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,UseSynchronizationContext = false)] class RfcServerClass : SAPBindingNamespace.SAPBindingService { public override Z_RFC_MKD_ADDResponse Z_RFC_MKD_ADD(Z_RFC_MKD_ADDRequest request) { // If either parameter is null throw an exception if (request.X == null || request.Y == null) throw new System.ArgumentNullException(); // Add the two operands int result = (int) (request.X + request.Y); return new Z_RFC_MKD_ADDResponse(result); } }
如果您使用 svcutil.exe 產生介面,您必須建立類別來實作 介面,並在此類別的適當方法中實作邏輯。
建立在步驟 2 中建立之 WCF 服務的實例。
// create service instance RfcServerClass rfcServerInstance = new RfcServerClass();
使用 WCF 服務和基底連線 URI,建立 System.ServiceModel.ServiceHost 的實例。 基底連線 URI 不能包含 userinfoparams 或 query_string。
// Enable service host Uri[] baseUri = new Uri[] { new Uri("sap://a/YourSAPHost/00") }; ServiceHost srvHost = new ServiceHost(pollingInstance, baseUri);
建立 SAPBinding ,並藉由設定其系結屬性來設定作業。 您可以在程式碼中明確執行此動作,或在組態中以宣告方式執行此動作。 您至少必須將 AcceptCredentialsInUri 設定為 true。
// Create and configure a binding for the service endpoint. NOTE: binding // parameters are set here for clarity, but these are already set in the // the generated configuration file SAPBinding binding = new SAPBinding(); // The credentials are included in the connection URI, so set this property to true binding.AcceptCredentialsInUri = true;
將服務端點新增至服務主機。 作法如下:
使用在步驟 5 中建立的系結。
指定包含認證的連線 URI,並指定接聽程式連線 (SAP 閘道、閘道服務和程式識別碼) query_string。 如需 SAP 連線 URI 的詳細資訊,請參閱 建立 SAP 系統連線 URI。
指定服務合約。 這是表示 WCF 服務合約的介面名稱。 若為 RFC,則為 「Rfc」。
// Add service endpoint // NOTE: The contract for the service endpoint is "Rfc". // This is the generated WCF service contract (interface) -- see SAPBindingInterface.cs. Uri serviceUri = new Uri("sap://User=YourUserName;Passwd=YourPassword;Client=800;Lang=EN;@a/YourSAPHost/00?ListenerGwServ=SAPGW00&ListenerGwHost=YourSapHost&ListenerProgramId=SAPAdapter"); srvHost.AddServiceEndpoint("Rfc", binding, serviceUri);
若要從 SAP 系統接收作業,請開啟服務主機。 每當 SAP 系統在步驟 6 的服務 URI 中叫用程式識別碼和系統指定的作業時,就會叫用您的 WCF 服務。
// Open the service host to begin receiving the operation. srvHost.Open();
若要停止接收作業,請關閉服務主機。
重要
配接器會繼續接收作業,直到服務主機關閉為止。 當您不想再收到作業時,應該一律關閉服務主機。
srvHost.Close();