SAP 어댑터를 사용하여 WCF 서비스 모델 개요
mySAP Business Suite용 Microsoft BizTalk 어댑터가 표시하는 작업을 사용하는 경우 코드는 어댑터에 대한 클라이언트 또는 서비스 역할을 합니다.
코드는 SAP 시스템에서 다음과 같은 종류의 작업을 호출하는 클라이언트 역할을 합니다.
RFC(원격 함수 호출)를 호출합니다.
tRFC(트랜잭션 원격 함수 호출)를 호출합니다.
BAPI(비즈니스 애플리케이션 프로그래밍 인터페이스)를 호출합니다.
중간 문서 보내기(IDOC)
코드는 다음과 같은 종류의 작업을 수신하는 서비스 역할을 합니다.
RFC(RFC 서버) 받기
tRFC 수신(tRFC 서버)
IDOC를 받습니다.
참고
BAPI는 BOR(Business Object Repository)에 있는 비즈니스 개체의 SAP 시스템에서 노출하는 메서드이므로 BAPI를 받을 수 없습니다.
WCF(Windows Communication Foundation) 서비스 모델에서 클라이언트와 서비스 사이에 존재하는 서비스 계약은 .NET 인터페이스로 표시되고 작업은 이 인터페이스에서 메서드로 표시됩니다. SAP 어댑터 및 WCF는 어댑터가 노출하는 메타데이터에서 대상 작업에 대해 이 인터페이스를 생성할 수 있는 도구를 제공합니다. 또한 이러한 도구는 서비스 인터페이스에 노출된 작업을 호출하는 데 사용할 수 있는 WCF 클라이언트 클래스를 만듭니다. 클라이언트 애플리케이션은 WCF 클라이언트 클래스의 메서드를 호출하여 어댑터에서 작업을 호출할 수 있습니다. SAP 어댑터에서 작업을 수신하는 서비스를 구현하려면 대상 작업에 대해 생성된 인터페이스를 구현합니다.
다음 섹션에서는 WCF 서비스 모델을 사용하여 SAP 어댑터에 대한 클라이언트 및 서비스 코드를 만드는 방법을 설명합니다.
WCF 클라이언트 만들기 및 SAP에서 작업 호출
WCF 서비스 모델을 사용하여 SAP 어댑터에서 작업을 호출하려면 먼저 대상 작업에 대한 WCF 클라이언트 클래스를 생성해야 합니다. 그런 다음, 이 클래스의 instance WCF 클라이언트를 만들고 해당 메서드를 호출하여 SAP 시스템에서 작업을 수행할 수 있습니다.
SAP 어댑터에서 작업을 호출하려면
WCF 클라이언트 클래스 및 도우미 코드를 생성합니다. 어댑터 서비스 참조 Visual Studio 플러그 인 추가 또는 serviceModel 메타데이터 유틸리티 도구(svcutil.exe)를 사용하여 작업하려는 SAP 시스템 아티팩트 대상으로 하는 WCF 클라이언트 클래스를 생성합니다. WCF 클라이언트를 생성하는 방법에 대한 자세한 내용은 SAP 솔루션 아티팩트용 WCF 클라이언트 또는 WCF 서비스 계약 생성을 참조하세요.
클라이언트 바인딩을 지정하여 WCF 클라이언트 instance 만듭니다. 클라이언트 바인딩을 지정하려면 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)를 사용하여 이 서비스의 instance 호스트합니다.
WCF 서비스를 만들고 구현하려면
WCF 서비스 계약 및 도우미 클래스를 생성합니다. 어댑터 서비스 참조 플러그 인 추가 또는 svcutil.exe 사용하여 작업하려는 SAP 시스템 아티팩트 대상으로 하는 WCF 서비스 계약(인터페이스)을 생성합니다. WCF 클라이언트를 생성하는 방법에 대한 자세한 내용은 SAP 솔루션 아티팩트용 WCF 클라이언트 또는 WCF 서비스 계약 생성을 참조하세요.
1단계에서 생성된 인터페이스 및 도우미 클래스에서 WCF 서비스를 구현합니다. 작업에 대한 데이터를 처리하는 동안 오류가 발생하면 해당 작업을 처리하는 메서드가 예외를 throw하여 SAP 시스템에 오류를 반환할 수 있습니다. 그렇지 않으면 메서드는 작업에 대한 적절한(생성된) 응답 클래스의 instance 반환해야 합니다. 다음과 같이 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 사용하여 인터페이스를 생성한 경우 인터페이스를 구현하는 클래스를 만들고 이 클래스의 appropriatemethod에서 논리를 구현해야 합니다.
2단계에서 만든 WCF 서비스의 instance 만듭니다.
// create service instance RfcServerClass rfcServerInstance = new RfcServerClass();
WCF 서비스 및 기본 연결 URI를 사용하여 System.ServiceModel.ServiceHost의 instance 만듭니다. 기본 연결 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단계에서 만든 바인딩을 사용합니다.
자격 증명을 포함하고 query_string 수신기 연결(SAP 게이트웨이, 게이트웨이 서비스 및 프로그램 ID)을 지정하는 연결 URI를 지정합니다. 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에 지정된 프로그램 ID 및 시스템에 대한 작업을 호출할 때마다 WCF 서비스가 호출됩니다.
// Open the service host to begin receiving the operation. srvHost.Open();
작업 수신을 중지하려면 서비스 호스트를 닫습니다.
중요
어댑터는 서비스 호스트가 닫을 때까지 작업을 계속 수신합니다. 작업을 더 이상 받지 않으려면 항상 서비스 호스트를 닫아야 합니다.
srvHost.Close();