SAP アダプターを使用した WCF サービス モデルの概要
microsoft BizTalk Adapter for mySAP Business Suite が表示する操作を使用すると、コードはクライアントまたはアダプターへのサービスとして機能します。
コードは、SAP システムで次の種類の操作を呼び出すクライアントとして機能します。
リモート関数呼び出し (RFC) を呼び出します。
トランザクション リモート関数呼び出し (tRFC) を呼び出します。
ビジネス アプリケーション プログラミング インターフェイス (BAPI) を呼び出します。
中間ドキュメントの送信 (IDOC)
コードは、次の種類の操作を受け取るサービスとして機能します。
RFC を受信する (RFC サーバー)
tRFC (tRFC サーバー) を受信する
IDOC を受け取ります。
Note
BAPI は、ビジネス オブジェクト リポジトリ (BOR) にあるビジネス オブジェクトに対して SAP システムによって公開されるメソッドであるため、BAPI を受け取ることはできません。
Windows Communication Foundation (WCF) サービス モデルでは、クライアントとサービスの間に存在するサービス コントラクトは .NET インターフェイスとして表され、操作はこのインターフェイスのメソッドとして表されます。 SAP アダプターと WCF には、アダプターが公開するメタデータから対象となる操作用にこのインターフェイスを生成できるツールが用意されています。 これらのツールでは、サービス インターフェイスで公開されている操作を呼び出すために使用できる WCF クライアント クラスも作成されます。 クライアント アプリケーションは、WCF クライアント クラスのメソッドを呼び出して、アダプターに対する操作を呼び出すことができます。 SAP アダプターから操作を受信するサービスを実装するには、ターゲット操作用に生成されたインターフェイスを実装します。
次のセクションでは、WCF サービス モデルを使用して、SAP アダプターのクライアントコードとサービス コードを作成する方法について説明します。
WCF クライアントの作成と SAP での操作の呼び出し
WCF サービス モデルを使用して SAP アダプターに対する操作を呼び出すには、最初にターゲット操作用の WCF クライアント クラスを生成する必要があります。 その後、このクラスのインスタンス 、WCF クライアントを作成し、そのメソッドを呼び出して SAP システムで操作を実行できます。
SAP アダプターで操作を呼び出すには
WCF クライアント クラスとヘルパー コードを生成します。 アダプター サービス参照の追加 Visual Studio プラグインまたは ServiceModel メタデータ ユーティリティ ツール (svcutil.exe) を使用して、使用する SAP システム成果物を対象とする WCF クライアント クラスを生成します。 WCF クライアントを生成する方法の詳細については、「WCF クライアント または SAP ソリューション成果物の WCF サービス コントラクトを生成する」を参照してください。
クライアント バインドを指定して WCF クライアント インスタンスを作成します。 クライアント バインドを指定するには、WCF クライアントが使用するバインディングとエンドポイント アドレスを指定する必要があります。 これは、コード内で命令的に行うか、構成で宣言的に行うことができます。 クライアント バインドを指定する方法の詳細については、「 SAP システムのクライアント バインドを構成する」を参照してください。 次のコードでは、SAP システムで RFC を呼び出すために使用できる WCF クライアントを作成します。 また、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 アダプターから操作を受信するには、まず、操作のために SAP アダプターによって公開されるサービス コントラクトを表す .NET インターフェイス (WCF サービス コントラクトとも呼ばれます) を生成する必要があります。 これを行う方法の詳細については、「 SAP ソリューション成果物の WCF クライアントまたは WCF サービス コントラクトを生成する」を参照してください。
次に、生成されたインターフェイスを実装して WCF サービスを実装します。 このクラスには、操作を処理し、アダプターに応答を返すビジネス ロジックが含まれています。 次に、サービス ホスト (System.ServiceModel.ServiceHost) を使用して、このサービスのインスタンスをホストします。
WCF サービスを作成して実装するには
WCF サービス コントラクトとヘルパー クラスを生成します。 アダプター サービス参照プラグインの追加または svcutil.exe を使用して、使用する SAP システム成果物を対象とする WCF サービス コントラクト (インターフェイス) を生成します。 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 を指定し、query_stringのリスナー接続 (SAP ゲートウェイ、ゲートウェイ サービス、およびプログラム ID) を指定します。 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 システムから操作を受信するには、サービス ホストを開きます。 WCF サービスは、SAP システムが手順 6 のサービス URI で指定されたプログラム ID とシステムに対して操作を呼び出すたびに呼び出されます。
// Open the service host to begin receiving the operation. srvHost.Open();
操作の受信を停止するには、サービス ホストを閉じます。
重要
アダプターは、サービス ホストが閉じられるまで操作を受け取り続けます。 操作を受け取る必要がなくなったら、常にサービス ホストを閉じる必要があります。
srvHost.Close();