다음을 통해 공유


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

웹 서비스와의 비동기 통신은 .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에 대한 클라이언트 만들기

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.