연습: SOAP 확장을 사용하여 SOAP 메시지 변경
이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation.
SOAP 확장을 .NET Framework SOAP 메시지 처리 파이프라인에 삽입하여 웹 서비스나 클라이언트에서 SOAP 요청 또는 응답 메시지를 serialize 또는 deserialize하는 동안 해당 메시지를 수정하거나 검사할 수 있습니다. 이 단계별 항목에서는 SOAP 확장을 빌드하고 실행하는 방법을 보여 줍니다. SOAP 확장의 수행 방법을 보여 주는 그림 설명 및 SOAP 확장 메서드가 메시지 처리 파이프라인에서 호출되는 순서를 보려면 SOAP 확장을 사용하는 SOAP 메시지 수정을 참조하십시오.
이 연습에서는 다음 작업을 수행합니다.
SoapExtension에서 클래스를 파생시킵니다.
SOAP 확장에서 처리를 완료하기 전후에 발생할 SOAP 메시지를 나타내는 Stream 개체에 대한 참조를 저장합니다.
SOAP 확장 고유의 데이터를 초기화합니다.
해당 SoapMessageStage 또는 단계 중에 SOAP 메시지를 처리합니다.
특정 웹 서비스 메서드와 함께 실행하도록 SOAP 확장을 구성합니다.
필수 구성 요소
SoapExtension에서 클래스를 파생시킵니다.
SoapExtension에서 파생되는 클래스는 SOAP 확장 기능을 수행하는 클래스입니다. 즉, SOAP 확장이 암호화 SOAP 확장인 경우 SoapExtension 클래스에서 파생되는 클래스는 암호화와 해당 해독을 수행합니다.
발생할 SOAP 메시지를 나타내는 스트림 개체에 대한 참조 저장
SOAP 메시지를 수정하려면 발생할 SOAP 메시지의 내용을 가져오는 데 사용할 수 있는 스트림에 대한 참조를 가져와야 합니다. 이 참조는 ChainStream 메서드 재정의를 통해서만 가져올 수 있습니다.
발생할 SOAP 메시지를 나타내는 스트림 개체에 대한 참조를 저장하려면
ChainStream 메서드를 재정의합니다.
ChainStream 메서드의 서명은 다음과 같습니다.
public virtual Stream ChainStream(Stream stream)
Public Overridable Function ChainStream(ByVal stream As Stream) As Stream
ChainStream 구현에서 매개 변수로 전달되는 Stream 인스턴스를 할당합니다.
Stream에 대한 참조는 SoapMessageStage 이전에 ChainStream에 한 번 전달됩니다. 이 Stream은 우선 순위가 낮은 SOAP 확장이 실행되어 SOAP 메시지를 변경한 후에 SOAP 메시지의 XML을 참조합니다. SOAP 확장 우선 순위에 대한 자세한 내용은 웹 서비스 메서드와 함께 실행하도록 SOAP 확장 구성을 참조하십시오. SOAP 확장은 나중에 SoapMessageStage가 실행되는 동안 SOAP 확장에서 SOAP 메시지를 검사하거나 수정할 때 액세스할 수 있도록 멤버 변수에 이 참조를 할당해야 합니다.
ChainStream으로 전달되는 Stream은 SOAP 확장에서 수정해야 하는 Stream이 아닙니다.
ChainStream 구현에서 새 Stream을 인스턴스화하고 해당 참조를 private 멤버 변수에 저장한 후 참조를 반환합니다.
다음 예제에서는 ChainStream 메서드의 일반 구현 방법을 보여 줍니다.
ChainStream 메서드의 일반 구현 예를 보려면 방법: ChainStream 메서드를 구현하여 스트림 개체에 대한 참조 저장을 참조하십시오.
SOAP 확장 고유의 데이터 초기화
SoapExtension에서 파생되는 클래스에는 데이터 초기화를 위한 두 가지 메서드인 GetInitializer와 Initialize가 있습니다.
ASP.NET 인프라가 GetInitializer 메서드를 호출하는 시간과 메서드에 전달되는 매개 변수는 SOAP 확장을 구성한 방법에 따라 다릅니다. 자세한 내용은 SOAP 확장을 사용하는 SOAP 메시지 수정 및 웹 서비스 메서드와 함께 실행하도록 SOAP 확장 구성을 참조하십시오.
특성을 사용하여 SOAP 확장 구성 시 데이터를 초기화하려면
다음 서명을 사용하여 GetInitializer 메서드를 구현합니다.
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
Public Overloads Overrides Function GetInitializer(methodInfo As _ LogicalMethodInfo, attribute As SoapExtensionAttribute) As Object
LogicalMethodInfo에서는 매개 변수 수, 매개 변수 데이터 형식 등과 같은 웹 서비스 메서드에 대한 기본 정보를 제공합니다.
필요할 경우 Initialize 메서드를 호출하여 GetInitializer에서 반환한 개체를 전달합니다. 대부분의 SoapExtension 구현에서는 Initialize 메서드를 비워둘 수 있습니다.
구성 파일에서 SOAP 확장 구성 시 데이터를 초기화하려면
다음 서명을 사용하여 GetInitializer 메서드를 구현합니다.
public override object GetInitializer(Type WebServiceType)
Public Overloads Overrides Function GetInitializer(WebServiceType As Type) As Object
Type 매개 변수는 웹 서비스를 구현하는 클래스의 클래스 형식입니다.
필요할 경우 Initialize 메서드를 호출하여 GetInitializer에서 반환한 개체를 전달합니다. 대부분의 SoapExtension 구현에서는 Initialize 메서드를 비워둘 수 있습니다.
SOAP 확장 구성 시 캐시된 데이터를 초기화하는 방법에 대한 예제를 보려면 방법: SOAP 확장이 구성된 경우 캐시된 데이터 초기화를 참조하십시오.
SOAP 메시지 처리
SoapExtension에서 파생된 클래스에서 구현의 핵심 부분은 ProcessMessage 메서드입니다. 이 메서드는 SoapMessageStage 열거형에 정의된 각 단계에서 ASP.NET에 의해 여러 번 호출됩니다.
SOAP 메시지를 처리하려면
추상 ProcessMessage 메서드를 구현합니다.
다음 ProcessMessage 메서드 구현에서는 웹 서비스에 대한 호출을 추적합니다. 추적 중에 SoapMessageStage에서 매개 변수가 XML로 serialize되었다고 나타내면 XML이 파일로 작성됩니다.
public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: break; case SoapMessageStage.AfterSerialize: // Write the SOAP message out to a file. WriteOutput( message ); break; case SoapMessageStage.BeforeDeserialize: // Write the SOAP message out to a file. WriteInput( message ); break; case SoapMessageStage.AfterDeserialize: break; default: throw new Exception("invalid stage"); } }
Public Overrides Sub ProcessMessage(message As SoapMessage) Select Case message.Stage Case SoapMessageStage.BeforeSerialize Case SoapMessageStage.AfterSerialize ' Write the SOAP message out to a file. WriteOutput(message) Case SoapMessageStage.BeforeDeserialize ' Write the SOAP messae out to a file. WriteInput(message) Case SoapMessageStage.AfterDeserialize Case Else Throw New Exception("invalid stage") End Select End Sub
웹 서비스 메서드와 함께 실행하도록 SOAP 확장 구성
사용자 지정 특성을 사용하거나 구성 파일을 수정하여 SOAP 확장을 실행하도록 구성할 수 있습니다. 사용자 지정 특성은 웹 서비스 메서드에 적용됩니다. 구성 파일을 사용하는 경우에는 SOAP 확장이 구성 파일의 범위 내에 있는 모든 웹 서비스에서 실행됩니다. 구성 파일의 동작 방법에 대한 자세한 내용은 Configuring Applications을 참조하십시오.
사용자 지정 특성을 사용하여 SOAP 확장을 구성하려면
SoapExtensionAttribute에서 클래스를 파생시킵니다.
SoapExtensionAttribute: ExtensionType 및 Priority의 두 속성을 구현합니다. SOAP 확장은 ExtensionType 속성에서 SOAP 확장 형식을 반환해야 합니다. SOAP 확장을 사용하여 SOAP 메시지 수정 시 우선 순위 그룹 적용에 설명된 것처럼 Priority 속성은 SOAP 확장의 상대적 우선 순위를 나타냅니다.
SOAP 확장을 함께 실행하려는 각 웹 서비스 메서드에 사용자 지정 특성을 적용합니다.
구성 파일에서 SOAP 확장을 구성하려면
soapExtensionTypes XML 요소가 없는 경우 해당 App.config 또는 Web.config 파일의 webServices 섹션에 추가합니다.
soapExtensionTypes XML 요소에서 구성 파일의 범위 내에 있는 모든 웹 서비스와 함께 실행할 각 SOAP 확장의 add XML 요소를 추가합니다.
add XML 요소에는 다음과 같은 속성이 있습니다.
type: SOAP 확장의 형식과 SOAP 확장이 있는 어셈블리를 지정합니다.
priority: 그룹 내에서 SOAP 확장의 상대적 우선 순위를 지정합니다.
Group: SOAP 확장이 멤버인 그룹을 지정합니다.
참고 항목
작업
방법: SOAP 확장 구현
방법: SOAP 확장이 구성된 경우 캐시된 데이터 초기화
방법: ChainStream 메서드를 구현하여 스트림 개체에 대한 참조 저장
참조
SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo
개념
SOAP 확장을 사용하는 SOAP 메시지 수정
XML Web services 수명에 대한 분석
XML Web services 클라이언트 빌드