WCF サービス モデルを使用して SAP で受信 tRFC 呼び出しを受信する
トランザクション RFC (tRFC) サーバーとして microsoft BizTalk Adapter for mySAP Business Suite を使用して、SAP からの受信 tRFC 呼び出しを受信できます。 受信 tRFC の場合、SAP アダプターは、同じ SAP 論理作業単位 (LUW) 内の複数の tRFC をサポートします。
このトピックのセクションでは、WCF サービス モデルでアダプターを tRFC サーバーとして使用する方法について説明します。
SAP アダプターを tRFC サーバーとして使用する方法の詳細については、次のトピックを参照してください。
SAP アダプターでの tRFC のサポートの概要については、「SAP での tRFC に対する操作」を参照してください。 続行する前に、このトピックをお読みください。
tRFC サーバー操作のメッセージ スキーマの詳細については、「 SAP での tRFC に対する操作」を参照してください。
tRFC の WCF サービス コントラクト
アダプター サービス参照の追加 Visual Studio プラグインまたは ServiceModel メタデータ ユーティリティ ツール (svcutil.exe) を使用して、SAP システムから受信する tRFC の WCF サービス コントラクトを生成します。 受信 tRFC に対して生成されるコントラクトは、次の点を除き、受信 RFC に対して生成されるコントラクトと似ています。
tRFC 操作は TRFC ノードの下に表示されます。
受信 tRFC に対して生成される WCF サービス コントラクト (インターフェイス) の名前は "Trfc" です。 サービス エンドポイントをサービス ホストに追加するときは、このインターフェイスを指定する必要があります。 これは、WCF サービスが実装する必要があるインターフェイスでもあります。
public interface Trfc { // CODEGEN: Generating message contract since the wrapper namespace (http://Microsoft.LobServices.Sap/2007/03/Trfc/) of message Z_RFC_MKD_ADDRequest does not match the default value (http://Microsoft.LobServices.Sap/2007/03/) [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.LobServices.Sap/2007/03/Trfc/Z_RFC_MKD_ADD", ReplyAction="http://Microsoft.LobServices.Sap/2007/03/Trfc/Z_RFC_MKD_ADD/response")] Z_RFC_MKD_ADDResponse Z_RFC_MKD_ADD(Z_RFC_MKD_ADDRequest request); }
TRFC 操作の要求メッセージ コントラクトには GUID パラメーターがあります。 これは、tRFC の SAP TID にマップされる GUID です。 tRFC サーバー操作では、この GUID を明示的に使用する理由がないように、アダプターは、コミット、ロールバック、および SAP システムによる TID の確認を行うすべての呼び出しを管理します。 ただし、 SapAdapterUtilities.ConvertGuidToTid を呼び出すことで、SAP アダプターから SAP TID を取得するために使用できます。 これは、SAP システムの問題のトラブルシューティングに役立ちます。
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.MessageContractAttribute(WrapperName="Z_RFC_MKD_ADD", WrapperNamespace="http://Microsoft.LobServices.Sap/2007/03/Trfc/", IsWrapped=true)] public partial class Z_RFC_MKD_ADDRequest { ... public Z_RFC_MKD_ADDRequest(string DEST, System.Nullable<int> X, System.Nullable<int> Y, System.Guid TransactionalRfcOperationIdentifier) { this.DEST = DEST; this.X = X; this.Y = Y; this.TransactionalRfcOperationIdentifier = TransactionalRfcOperationIdentifier; } }
操作方法 アダプターが tRFC サーバーとして機能することを有効にしますか?
アダプターが tRFC サーバーとして機能できるようにするには、TidDatabaseConnectionString バインド プロパティを TID データベースの接続文字列に設定する必要があります。 これは、サービス ホストを開く前に行う必要があります。 これは、アダプターが各 tRFC の SAP トランザクション ID (TID) を格納するデータベースです。 このバインディング プロパティの詳細については、「 BizTalk Adapter for mySAP Business Suite Binding Properties」を参照してください。
操作方法受信 tRFC のトランザクションに参加しますか?
SAP 論理作業単位 (LUW) には、複数の tRFC を含めることができます。 SAP システムでは、LUW は一意のトランザクション ID (TID) によって識別されます。 アダプターは、SAP システムがアダプターで tRFC 呼び出しを呼び出すときに使用する各 TID に対してコミット可能なトランザクションを作成します。 SAP システムがアダプターで tRFC を呼び出す場合。アダプターは、SAP TID に関連付けられているトランザクションをサービスにフローします。 このトランザクションには、操作メソッド内からアンビエント トランザクションとしてアクセスできます。 このアンビエント トランザクションに参加することで、操作で実行されたアクションを SAP LUW に参加させることができます。
操作メソッドでアンビエント トランザクションに参加するには、次の操作を行う必要があります。
OperationBehavior 属性の TransactionScopeRequired プロパティを使用して、操作メソッドに注釈を付けます。 これにより、操作内からアンビエント トランザクションにアクセスする必要があることを WCF に通知します。
OperationBehavior 属性の TransactionAutoComplete プロパティを使用して操作メソッドに注釈を付けるか、操作メソッド内で TransactionScope を明示的に使用して、トランザクション スコープを作成します。
次の例は、2 つの操作を実装するサービスを示しています。 どちらの操作メソッドにも、アンビエント トランザクションにアクセスするための TransactionScopeRequired プロパティで注釈が付けられます。
Z_TRFC_EXAMPLE1TransactionScope オブジェクトを使用して、トランザクションに明示的に参加させます。
Z_TRFC_EXAMPLE2 に TransactionAutoComplete プロパティで注釈を付けて、トランザクションに参加させます
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
class Z_Example_ServiceContractClass : Trfc
{
// This operation method explicitly creates a TransactionScope to enlist in the ambient transaction
// You must explictly call ts.Complete to complete the transaction before you return from the operation
// Otherwise the transaction is aborted.
// You can throw an exception or return without calling ts.complete to abort the transacation
[OperationBehavior(TransactionScopeRequired = true)]
public Z_TRFC_EXAMPLE1Response Z_TRFC_EXAMPLE1(Z_TRFC_EXAMPLE1Request request)
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
// Process tRFC
...
Z_TRFC_EXAMPLE1Response response = new Z_TRFC_EXAMPLE1Response();
response.TransactionalRfcOperationIdentifier = request.TransactionalRfcOperationIdentifier;
return response;
//since there is no ts.Complete(), this is equivalent to a rollback.
}
}
// This operation method sets the TransactionAutoComplete property of the OperationBehavior attribute
// to enlist in the transaction. There is no need to explictly create a TransactionScope in the code.
// If the method returns with no unhandled exceptions, the transaction completes; otherwise it aborts
// You can throw an exception to abort the transaction.
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public Z_TRFC_EXAMPLE2Response Z_TRFC_EXAMPLE2(Z_TRFC_EXAMPLE2Request request)
{
// Process tRFC
...
Z_TRFC_EXAMPLE2Response response = new Z_TRFC_EXAMPLE2Response();
response.TransactionalRfcOperationIdentifier = request.TransactionalRfcOperationIdentifier;
return response;
//if there is no unhandled exception, the transaction completes when the operation returns.
}
}