XML Web services와 비동기적으로 통신

이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation.

웹 서비스와의 비동기 통신은 .NET Framework의 두 가지 비동기 메서드 호출 디자인 패턴을 따릅니다. 이때 주의할 점은 비동기적으로 호출할 비동기 요청을 처리하기 위해 웹 서비스를 별도로 작성할 필요가 없다는 점입니다.

Wsdl.exe 및 .NET Framework 비동기 디자인 패턴

웹 서비스 기술 언어 도구(Wsdl.exe)를 사용하여 지정된 웹 서비스에 액세스할 클라이언트 프록시 클래스를 생성할 때, 프록시 클래스에 각 웹 서비스 메서드와 비동기적으로 통신하는 두 가지 메커니즘이 제공됩니다. 첫 번째 메커니즘은 Begin/End 패턴이고, 두 번째 메커니즘은 .NET Framework 버전 2.0에서 사용할 수 있는 이벤트 구동 비동기 프로그래밍 패턴입니다. 웹 서비스에서 패턴을 사용하는 방법에 대한 간략한 설명은 다음 단원을 참조하십시오. 두 가지 패턴에 대한 자세한 내용은 Asynchronous Programming Design Patterns을 참조하십시오.

Begin/End 호출 패턴

Wsdl.exe는 웹 서비스에 게시되는 각 작업(ASP.NET의 웹 서비스 메서드)에 대해 세 개의 메서드를 자동으로 생성합니다. 그 중 하나는 동기 액세스용이고 다른 두 개는 비동기 액세스용입니다. 웹 서비스 메서드의 비동기 구현이 하나만 있는 경우에도 마찬가지입니다. 다음 표에서는 이러한 세 가지 메서드에 대해 설명합니다.

프록시 클래스의 메서드 이름 설명

<NameOfWebServiceMethod>

<NameOfWebServiceMethod>라는 웹 서비스 메서드에 대한 메시지를 동기적으로 보냅니다.

Begin<NameOfWebServiceMethod>

<NameOfWebServiceMethod>라는 웹 서비스 메서드와의 비동기 메시지 통신을 시작합니다. 클라이언트는 Begin 메서드에 서비스 호출 처리를 시작하고 즉시 반환하도록 지시합니다. 반환 값은 웹 서비스 메서드에 지정된 데이터 형식이 아니라 IAsyncResult 인터페이스를 구현하는 형식입니다.

End<NameOfWebServiceMethod>

<NameOfWebServiceMethod>라는 웹 서비스 메서드와의 비동기 메시지 통신을 종료하고 웹 서비스 메서드 호출의 결과 값을 반환합니다.

BeginEnd 메서드는 .NET Framework의 비동기 디자인 패턴에 대한 명명 규칙을 따릅니다. 이 디자인 패턴에 따르면 동기 메서드별로 해당 명명 규칙에 따라 이름이 지정된 두 개의 비동기 메서드가 있습니다.

다음 서명을 사용하여 소수를 검색하는 웹 서비스 메서드를 가진 PrimeFactorizer라는 웹 서비스 클래스를 예로 들어 보겠습니다.

public long[] Factorize(long factorizableNum)

이러한 메서드는 입력에 따라 처리를 완료하는 데 상대적으로 많은 시간이 소요될 수 있습니다. 따라서 웹 서비스 클라이언트에서 웹 서비스 메서드를 비동기적으로 호출하게 해야 하는 경우의 좋은 예입니다.

Wsdl.exe에서 이 웹 서비스를 클라이언트 프록시 코드 생성을 위한 입력으로 사용한 경우(ASP.NET 웹 서비스에 대해 ?wsdl 쿼리 문자열 사용) 다음과 같은 서명을 가진 메서드가 생성됩니다.

public long[] Factorize(long factorizableNum)
public System.IAsyncResult BeginFactorize(long factorizableNum, System.AsyncCallback callback, object asyncState)
public long[] EndFactorize(System.IAsyncResult asyncResult)

Begin/End 패턴을 사용하여 비동기 메서드 호출을 수행하는 웹 서비스 클라이언트 구현

클라이언트에서는 End 메서드를 호출할 시기를 어떻게 알 수 있을까요? .NET Framework에서는 클라이언트에서 이를 확인하기 위한 두 가지 기술을 정의하고 있습니다.

  • 대기 기술: 클라이언트가 메서드가 완료될 때까지 기다리게 하려면 WaitHandle 클래스의 메서드 중 하나를 사용합니다.

  • 콜백 기술: Begin 메서드에 콜백 함수를 전달합니다. 전달된 이 함수는 메서드의 작업이 완료되면 결과를 가져오기 위해 호출됩니다.

참고: 클라이언트가 웹 서비스와 비동기적으로 통신하기 위해 선택하는 기술에 상관없이 주고 받는 SOAP 메시지는 동기 프록시 메서드를 통해 생성되는 SOAP 메시지와 동일합니다. 즉, 네트워크를 통해 SOAP 요청과 SOAP 응답이 하나만 전송 및 수신됩니다. 프록시 클래스는 클라이언트에서 Begin 메서드를 호출하는 데 사용한 스레드와 다른 스레드를 사용하여 SOAP 응답을 처리함으로써 이 작업을 수행합니다. 따라서 프록시 클래스가 SOAP 응답을 수신하여 처리하는 동안 클라이언트는 해당 스레드에서 다른 작업을 계속 수행할 수 있습니다.

Begin/End 패턴을 사용하는 대기 기술

WaitHandle 클래스는 동기화 개체의 신호 대기를 지원하는 메서드(WaitOne, WaitAny, WaitAll)를 구현합니다. 동기화 개체의 신호는 지정된 리소스를 대기 중인 스레드가 이제 해당 리소스에 액세스할 수 있다는 표시입니다. 웹 서비스 클라이언트는 Begin 메서드에서 반환된 IAsyncResult 개체의 AsyncWaitHandle 속성을 통해 WaitHandle 개체에 액세스합니다.

이 기술에 대한 예제는 방법: 대기 기술을 사용하여 비동기 웹 서비스 클라이언트 구현을 참조하십시오.

Begin/End 패턴을 사용하는 콜백 기술

콜백 함수는 콜백 기술을 사용하여 AsyncCallback 대리자를 구현하고 서명을 적용합니다.

public void MethodName(IAsyncResult ar)

이 기술에 대한 예제는 방법: 콜백 기술을 사용하여 비동기 웹 서비스 클라이언트 구현을 참조하십시오.

콜백에 동기화/스레드 선호도 컨텍스트가 필요할 경우 컨텍스트 디스패처 인프라를 통해 디스패치됩니다. 따라서 콜백은 그러한 컨텍스트의 호출자에 대해 비동기적으로 실행될 수 있으며, 메서드 서명에 대한 단방향 한정자의 의미를 갖습니다. 즉, 이러한 모든 메서드 호출은 원격 호출자에 대해 동기적 또는 비동기적으로 실행될 수 있으며, 호출자는 실행 컨트롤이 반환될 때 해당 호출이 완료되었다고 가정할 수 없습니다.

비동기 작업이 완료되기 전에 End 메서드를 호출하면 호출자가 차단됩니다. Begin 메서드에서 반환하는 동일한 IAsyncResult를 사용하여 두 번째 호출하는 동작은 정의되어 있지 않습니다.

이벤트 구동 비동기 패턴을 사용하는 비동기 웹 서비스 클라이언트

Multithreaded Programming with the Event-based Asynchronous Pattern에서는 복잡한 다중 스레드 코드를 직접 구현할 필요 없이 다중 스레드 응용 프로그램을 쉽게 빌드할 수 있도록 이벤트를 통해 콜백을 처리하는 새로운 비동기 프로그래밍 모델을 소개합니다. 새로운 이벤트 구동 비동기 모델에 대한 개요는 Event-based Asynchronous Pattern Overview를 참조하십시오. 새 모델을 사용하는 클라이언트 구현에 대한 자세한 내용은 How to: Implement a Client of the Event-based Asynchronous Pattern을 참조하십시오.

이벤트 구동 패턴을 사용하여 웹 서비스를 빌드하는 방법에 대한 자세한 내용은 방법: ASP.NET 2.0을 사용하여 이벤트 구동 비동기 웹 서비스 클라이언트 구현을 참조하십시오.

참고 항목

작업

방법: 대기 기술을 사용하여 비동기 웹 서비스 클라이언트 구현
방법: 콜백 기술을 사용하여 비동기 웹 서비스 클라이언트 구현
방법: 웹 서비스 클라이언트에서 비동기 호출 수행

개념

XML Web services 클라이언트 빌드
ASP.NET을 사용하여 만든 XML Web services에 대한 디자인 지침

기타 리소스

XML Web services에 대한 클라이언트 만들기