다음을 통해 공유


WCF 서비스 모델을 사용하여 SAP에서 인바운드 tRFC 호출 수신

microsoft BizTalk Adapter for mySAP Business Suite를 tRFC(트랜잭션 RFC) 서버로 사용하여 SAP에서 인바운드 tRFC 호출을 받을 수 있습니다. 인바운드 tRFC의 경우 SAP 어댑터는 동일한 LUW(SAP 논리 단위)에서 여러 tRFC를 지원합니다.

이 항목의 섹션에서는 WCF 서비스 모델에서 어댑터를 tRFC 서버로 사용하는 방법에 대한 정보를 제공합니다.

다음 topics 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에 참여할 수 있습니다.

작업 메서드에서 앰비언트 트랜잭션에 참여하려면 다음을 수행해야 합니다.

  1. OperationBehavior 특성의 TransactionScopeRequired 속성으로 작업 메서드에 주석을 추가합니다. 이렇게 하면 작업 내에서 앰비언트 트랜잭션에 액세스하도록 WCF에 알릴 수 있습니다.

  2. 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.  
    }  
}  

참고 항목

WCF 서비스 모델을 사용하여 애플리케이션 개발