WCF 서비스 모델을 사용하여 SAP에서 인바운드 tRFC 호출 수신
microsoft BizTalk Adapter for mySAP Business Suite를 tRFC(트랜잭션 RFC) 서버로 사용하여 SAP에서 인바운드 tRFC 호출을 받을 수 있습니다. 인바운드 tRFC의 경우 SAP 어댑터는 동일한 LUW(SAP 논리 단위)에서 여러 tRFC를 지원합니다.
이 항목의 섹션에서는 WCF 서비스 모델에서 어댑터를 tRFC 서버로 사용하는 방법에 대한 정보를 제공합니다.
다음 topics 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 서버 작업에서 어댑터는 SAP 시스템에서 TID를 커밋, 롤백 및 확인하는 모든 호출을 관리하므로 이 GUID를 명시적으로 사용할 이유가 없습니다. 그러나 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 TID(트랜잭션 ID)를 저장하는 데이터베이스입니다. 이 바인딩 속성에 대한 자세한 내용은 mySAP Business Suite 바인딩 속성에 대한 BizTalk 어댑터에 대한 읽기를 참조하세요.
어떻게 할까요? 인바운드 tRFC에 대한 트랜잭션에 참여하시겠습니까?
SAP LUW(논리 작업 단위)에는 여러 tRFC가 포함될 수 있습니다. SAP 시스템에서 LUW는 고유한 TID(트랜잭션 ID)로 식별됩니다. 어댑터는 어댑터에서 tRFC 호출을 호출할 때 SAP 시스템에서 사용하는 각 TID에 대해 커밋 가능한 트랜잭션을 만듭니다. SAP 시스템이 어댑터에서 tRFC를 호출하는 경우 어댑터는 SAP TID와 연결된 트랜잭션을 서비스로 흐릅니다. 작업 메서드 내에서 앰비언트 트랜잭션으로 이 트랜잭션에 액세스할 수 있습니다. 이 앰비언트 트랜잭션에 참여하면 작업에서 수행된 작업이 SAP LUW에 참여할 수 있습니다.
작업 메서드에서 앰비언트 트랜잭션에 참여하려면 다음을 수행해야 합니다.
OperationBehavior 특성의 TransactionScopeRequired 속성으로 작업 메서드에 주석을 추가합니다. 이렇게 하면 작업 내에서 앰비언트 트랜잭션에 액세스하도록 WCF에 알릴 수 있습니다.
OperationBehavior 특성의 TransactionAutoComplete 속성으로 작업 메서드에 주석을 추가하거나 작업 메서드 내에서 TransactionScope를 명시적으로 사용하여 트랜잭션 scope 만듭니다.
다음 예제에서는 두 작업을 구현하는 서비스를 보여 줍니다. 두 작업 메서드 모두 앰비언트 트랜잭션에 액세스하기 위해 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.
}
}