SOAP 확장을 사용하는 SOAP 메시지 수정

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

SOAP 확장을 사용하면 개발자가 웹 서비스 또는 웹 서비스 클라이언트에서 보내거나 받은 SOAP 메시지를 변경하여 웹 서비스의 기능을 확장할 수 있습니다. 예를 들어, 암호화 또는 압축 알고리즘을 구현하여 기존 웹 서비스에서 실행할 수 있습니다.

SOAP 확장의 작동 방식을 이해하려면 먼저 웹 서비스의 수명을 이해해야 합니다. 자세한 내용은 XML Web services 수명에 대한 분석을 참조하십시오.

다음 그림에서는 클라이언트에서 웹 서비스로의 호출에 대한 주요 단계를 간략하게 보여 줍니다.

XML Web services 수명

.NET Framework는 웹 서비스 컴퓨터와 웹 서비스 클라이언트 컴퓨터 모두에서 단계 중에 XML을 serialize 및 deserialize합니다. SOAP 확장은 인프라에 삽입되어 각 serialize 및 deserialize 단계 전후에 SOAP 메시지를 검사하거나 수정할 수 있습니다. 예를 들어, 암호화 SOAP 확장은 .NET Framework에서 클라이언트의 인수를 serialize하고 SOAP 메시지의 XML 부분을 암호화한 다음, .NET Framework에서 SOAP 메시지를 deserialize하기 전에 웹 서버에서 SOAP 메시지를 해독할 수 있습니다. SOAP 확장이 SOAP 메시지를 검사하거나 수정하는 이러한 단계는 SoapMessageStage 열거형에 정의됩니다. 이 경우 SOAP 확장은 AfterSerialize 단계에서 암호화되고 BeforeDeserialize 단계에서 해독됩니다.

일반적으로 SOAP 확장에서 SOAP 메시지의 내용을 수정할 경우 클라이언트와 서버 모두에서 수정해야 합니다. 즉, SOAP 확장을 클라이언트에서 실행하여 SOAP 메시지를 암호화할 경우 해당 SOAP 확장은 서버에서 SOAP 메시지를 해독해야 합니다. SOAP 메시지가 해독되지 않으면 ASP.NET 인프라가 SOAP 메시지를 개체로 deserialize할 수 없습니다.

SOAP 메시지를 단순히 기록만 하며 SOAP 메시지를 수정하지 않는 SOAP 확장은 클라이언트 또는 서버에서만 실행할 수 있습니다. 이 경우 수신측은 SOAP 확장을 실행하지 않는 경우와 동일한 SOAP 메시지를 수신하고 ASP.NET 인프라에서 SOAP 메시지를 deserialize할 수 있습니다. 또한 SOAP 확장에서 SOAP를 수정하여 deserailize가 불가능해지는 경우가 아니라면, SOAP 확장을 클라이언트와 서버 모두에서 실행할 필요가 없습니다.

SOAPExtension 클래스 확장

SOAP 확장을 구현하려면 SoapExtension 클래스에서 클래스를 파생시킵니다. SOAPExtension 클래스의 다음 세 메서드는 반드시 구현해야 합니다.

이러한 메서드를 구현하는 방법에 대해서는 연습: SOAP 확장을 사용하여 SOAP 메시지 변경 항목에서 단계별로 설명합니다.

ChainStream 메서드는 Stream 개체를 전달 받고 Stream 개체를 반환합니다. SOAP 확장은 각 SoapMessageStage 중에 실행되어 SOAP 메시지를 수정할 때, ChainStream에 전달된 Stream을 읽은 후 ChainStream에서 반환된 Stream에 이를 기록해야 합니다. 따라서 ChainStream 메서드 내에서 멤버 변수에 대한 모든 Stream 참조를 할당해야 합니다.

SoapExtension에서 파생된 클래스는 GetInitializerInitialize 메서드를 사용하여 적용되는 웹 서비스 또는 웹 서비스 메서드를 기반으로 내부 데이터를 초기화합니다. 예를 들어, 웹 서비스 메서드에서 보내거나 받은 SOAP 메시지를 기록하는 SOAP 확장은 실행에 사용할 웹 서비스 메서드나 웹 서비스의 이름을 기반으로 로깅 정보가 저장되는 파일 이름을 초기화할 수 있습니다.

웹 서비스 인프라가 GetInitializer 메서드를 호출하는 지점과 이 메서드에 전달되는 매개 변수는 SOAP 확장이 구성된 방법에 따라 다음과 같이 다릅니다.

  • 특성을 사용하여 SOAP 확장을 구성하는 경우, GetInitializermethod 웹 서비스에 처음 액세스할 때 웹 서비스 인프라에 의해 호출됩니다.

  • SOAP 확장을 구성 파일에서 구성하는 경우, GetInitializer는 전체 웹 서비스에 처음 액세스할 때에만 웹 서비스 인프라에 의해 호출됩니다.

웹 서비스 인프라는 GetInitializer 메서드에서 반환하는 개체를 캐시합니다. 그런 다음 해당 웹 서비스 또는 웹 서비스 메서드를 통해 SOAP 확장이 실행될 때마다 이니셜라이저 개체를 Initialize 메서드에 전달합니다.

표준 SOAP 처리 외의 실제 확장 처리는 ProcessMessage 메서드에 의해 수행됩니다. 웹 서비스 인프라는 ProcessMessage를 호출할 때마다 특정 단계의 SOAP 메시지에 대한 정보를 포함하는, SoapMessage에서 파생된 클래스 인스턴스를 인수로 전달합니다. SOAP 확장이 웹 서비스에서 실행되면 SoapServerMessage 개체가 전달되고, SOAP 확장이 웹 서비스 클라이언트에서 실행되면 SoapClientMessage 개체가 전달됩니다.

SOAP 확장 및 예외

SOAP 확장은 예외를 자체적으로 throw하지 않습니다. 그러나 ProcessMessage 메서드에서 전달된 SoapMessage 개체의 Exception 속성에 예외 정보를 추가할 수 있습니다.

또한 SOAP 확장이 설치되는 응용 프로그램에서 동일한 기능을 사용하여 모든 예외를 catch한 다음, 반환된 SOAP 오류 수정과 같은 일부 동작을 수행함으로써 응용 프로그램 차원에서 예외 처리기 역할을 할 수 있습니다.

SOAP 확장 메서드가 호출되는 순서

SOAP 확장에서 재정의하는 메서드에 대해 살펴보았으므로 이제는 웹 서비스 인프라에서 웹 서비스 메서드를 호출하여 SOAP 확장 메서드를 호출하는 시점을 알아 보겠습니다. 다음 단계에서는 SOAP 확장이 클라이언트와 서버 모두에서 실행된다고 가정합니다. SOAP 확장이 클라이언트와 서버 중 한쪽에서만 실행될 경우 각각에서 실행되는 SOAP 확장과 관련된 단계는 .NET Framework에서 무시됩니다.

클라이언트측의 요청 메시지 준비

  1. 클라이언트가 프록시 클래스에 메서드를 호출합니다.

  2. 클라이언트에 SOAP 확장의 새 인스턴스가 생성됩니다.

  3. 클라이언트에서 이 웹 서비스에 대해 해당 SOAP 확장을 처음 실행할 경우 클라이언트에서 실행 중인 SOAP 확장에서 GetInitializer 메서드가 호출됩니다.

  4. Initialize 메서드가 호출됩니다.

  5. ChainStream 메서드가 호출됩니다.

  6. SoapMessageStageBeforeSerialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  7. 클라이언트 컴퓨터의 ASP.NET에서 웹 서비스 메서드의 인수를 XML로 serialize합니다.

  8. SoapMessageStageAfterSerialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  9. 클라이언트 컴퓨터의 ASP.NET에서 웹 서비스를 호스팅하는 웹 서버에 SOAP 메시지를 네트워크를 통해 보냅니다.

서버측의 요청 메시지 수신 및 응답 준비

  1. 웹 서버의 ASP.NET에서 SOAP 메시지를 받습니다.

  2. 웹 서버에 SOAP 확장의 새 인스턴스가 생성됩니다.

  3. 웹 서버에서 이 웹 서비스에 대해 해당 SOAP 확장을 처음 실행할 경우 서버에서 실행 중인 SOAP 확장에서 GetInitializer 메서드가 호출됩니다.

  4. Initialize 메서드가 호출됩니다.

  5. ChainStream 메서드가 호출됩니다.

  6. SoapMessageStageBeforeDeserialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  7. ASP.NET에서 XML의 인수를 deserialize합니다.

  8. SoapMessageStageAfterDeserialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  9. ASP.NET에서 웹 서비스를 구현하는 클래스의 새 인스턴스를 만들고 웹 서비스 메서드를 호출하여 deserialize된 인수로 전달합니다. 이 개체는 웹 서버와 동일한 컴퓨터에 있습니다.

  10. 웹 서비스 메서드가 해당 코드를 실행하여 반환 값과 모든 out 매개 변수를 설정합니다.

  11. SoapMessageStageBeforeSerialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  12. 웹 서버의 ASP.NET에서 반환 값과 out 매개 변수를 XML로 serialize합니다.

  13. SoapMessageStageAfterSerialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  14. ASP.NET에서 네트워크를 통해 SOAP 응답 메시지를 웹 서비스 클라이언트에 다시 보냅니다.

클라이언트측의 응답 메시지 수신

  1. 클라이언트 컴퓨터의 ASP.NET에서 SOAP 메시지를 받습니다.

  2. SoapMessageStageBeforeDeserialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  3. ASP.NET에서 XML을 반환 값 및 out 매개 변수로 deserialize합니다.

  4. SoapMessageStageAfterDeserialize로 설정되어 ProcessMessage 메서드가 호출됩니다.

  5. ASP.NET에서 반환 값 및 out 매개 변수를 프록시 클래스의 인스턴스로 전달합니다.

  6. 클라이언트에서 반환 값 및 out 매개 변수를 받습니다.

SOAP 확장 구현

클라이언트 또는 서버 응용 프로그램에서 SOAP 확장을 실행하는 방법에는 두 가지가 있습니다. 첫째, 확장을 실행하도록 응용 프로그램을 구성할 수 있습니다. 모든 웹 서비스 특히 vroot에서 모든 웹 서비스에 대해 SOAP 확장을 실행하도록 구성하려면 Web.config 파일에서 <soapExtensionTypes> 요소 섹션을 편집합니다. 다음 코드에서는 줄 바꿈 없이 한 줄로 표시되어야 하고, 정규화된 확장 이름과 서명된 어셈블리의 버전, 문화권 및 공개 키 토큰을 포함해야 하는 type 특성 값을 보여 줍니다.

<configuration>
 <system.web>
    <webServices>
      <soapExtensionTypes>
        <add type="Contoso.MySoapExtension, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
priority="1" group="0"/>
        </soapExtensionTypes>
    </webServices>
  </system.web>
</configuration>

둘째, 웹 서비스 메서드에 적용되는 사용자 지정 특성을 만들 수 있습니다. 사용자 지정 특성을 만들려면 SoapExtensionAttribute에서 파생되는 클래스를 만듭니다. 사용자 지정 특성 만들기에 대한 자세한 내용은 방법: SOAP 확장 구현을 참조하십시오. 사용자 지정 특성 만들기에 대한 자세한 내용은 사용자 지정 특성 만들기를 참조하십시오.

esw638yk.note(ko-kr,VS.100).gif참고:
SOAP 확장을 구현할 때 확장이 XmlTextReader를 사용하여 데이터 스트림을 읽는 경우 DOS(서비스 거부) 공격에 노출될 수 있습니다. ProhibitDtd 속성을 true로 설정하는 것은 이러한 공격을 방지하는 한 방법입니다.

우선 순위 및 우선 순위 그룹

여러 SOAP 확장을 하나의 XML Web services 메서드와 함께 실행하도록 구성할 경우 특성 또는 구성을 사용하여 SOAP 확장에 우선 순위를 지정함으로써 상대적 실행 순서를 결정할 수 있습니다. SOAP 확장의 우선 순위가 높을수록 네트워크를 통해 전송되거나 수신되는 SOAP 메시지에 더 가깝게 실행됩니다. SOAP 확장은 세 가지 우선 순위 그룹 중 하나에 속합니다. 각 그룹에서는 priority 속성이 각 멤버를 구별합니다. priority 속성이 낮을수록 상대적 우선 순위가 더 높습니다(0이 가장 높은 우선 순위).

SOAP 확장의 세 가지 상대적 우선 순위 그룹은 특성을 사용하여 구성된 SOAP 확장과 구성 파일에서 group0 또는 1로 설정하여 지정된 SOAP 확장입니다. 우선 순위는 다음과 같이 지정됩니다.

  • 가장 높은 우선 순위 그룹: group0으로 설정하여 구성 파일에서 구성한 SOAP 확장

  • 보통 우선 순위 그룹: 특성을 사용하여 구성한 SOAP 확장

  • 가장 낮은 우선 순위 그룹: group1로 설정하여 구성 파일에서 구성한 SOAP 확장

다음 코드 예제에서는 Logger.LoggerExtension SOAP 확장이 상대적 우선 순위 그룹 0에서 실행되고 우선 순위 값 1을 지정하는 구성 파일을 보여 줍니다.

<configuration>
 <system.web>
   <webServices>
     <soapExtensionTypes>
      <add type="Logger.LoggerExtension,logger"
           priority="1"
           group="0" />
     </soapExtensionTypes>
    </webServices>
 </system.web>
</configuration>

참고 항목

작업

방법: SOAP 확장 구현

참조

SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo

개념

SOAP 확장을 사용하는 SOAP 메시지 수정
XML Web services 수명에 대한 분석
XML Web services 클라이언트 빌드

기타 리소스

Configuring Applications
ASP.NET을 사용하는 XML Web services