본문 바로가기
개발언어/ASP.NET

Microsoft .NET Framework 및 Visual Studio.NET에서의 SOAP

by 엔돌슨 2008. 1. 10.
반응형
http://www.misofruit.co.kr/seojewoo/programming/rms3_3.htm

Microsoft .NET Framework 및 Visual Studio.NET에서의 SOAP  


요약: .NET Remoting, ASP.NET 웹 서비스, 그리고 ATL 웹 서비스에서 제공하는 SOAP에 대해 설명합니다(11페이지/인쇄 페이지 기준).

목차

소개
웹 개발 도구로 SOAP 사용
구성 요소 개발 도구로 SOAP 사용
ATL 개발 도구로 SOAP 사용
결론

 

소개

Microsoft®.NET Framework 및 Microsoft® Visual Studio.NET은 XML과 SOAP 기술을 사용하므로 개발자들은 이러한 기술을 이용하여 솔루션을 만들 수 있습니다. SOAP는 광범위한 산업 분야를 지원하는 간단한 경량 프로토콜입니다. 또한 다양한 응용 프로그램에 유용하고 효율적입니다. SOAP와 .NET Framework는 쉽고 일반적인 도구입니다.

SOAP는 다양한 요구 사항에 다양한 방법으로 구현될 수 있도록 매우 간단한 프로토콜을 만드는 원리에 입각하여 설계되었습니다. Microsoft뿐만 아니라 IBM, Develop Mentor, Userland 등의 많은 회사들도 프로토콜을 구현했습니다.

SOAP를 사용하는 프레임워크에는 몇 가지 핵심 기술이 있습니다. 각 기능들은 개발자들이 SOAP 기반 솔루션을 만들 때 직면하는 일반적인 문제를 해결합니다. 이러한 분야는 .NET Remoting, ASP.NET 웹 서비스 및 ATL 웹 서비스입니다. 이러한 기능은 몇 개의 공통적인 기술과 특징을 공유합니다.

  • 메시지 생성 및 사용을 위한 XML

  • 섹션 5 SOAP 인코딩을 포함하는 SOAP 1.1 요건 충족 정보. 다른 SOAP 구현과의 강력한 SOAP 상호 작용을 가능하게 합니다.

  • 자주 연결이 끊기는 모델을 위한 XML 성능(섹션 5 SOAP 인코딩이 아님)

  • 설명을 위한 WSDL(XML 스키마 형식)

  • 상태 비저장 프로그래밍 모델을 사용한 배율화

  • Visual Studio.NET의 뛰어난 개발 환경

ASP.NET 웹 서비스 및 .NET Remoting은 다음 기능을 공유합니다.

  • XCOPY 배포

  • 네트워크 통신을 위해 서버 및 클라이언트 환경 모두에서 수행되는 System.Net

  • 처리된 코드 및 스레드 풀을 위해 제공되는 공통 언어 런타임

  • SOAP 헤더 및 단방향 메시지와 같은 기능을 위한 강력한 SOAP 지원

  • 응용 프로그램을 작성하기 위해 C#, Visual Basic.NET, 또는 CLS 호환 언어(Cobol, Python, ComponentPascal 등)를 사용할 가능성

 

위에서 열거한 일반적인 특징과 기술 이외에도 ASP.NET 웹 서비스, .NET Remoting 및 ATL 웹 서비스는 개발자를 위한 많은 독특한 기능을 제공합니다. 다음 사항은 개발자들이 응용 프로그램을 구축할 때 올바른 방향으로 시작할 수 있도록 도와줍니다.

.ASP 응용 프로그램을 만들 경우 ASP.NET 웹 서비스는 다음을 제공합니다.

  • ASP.NET HTTP 런타임과의 강력한 통합

  • XSD 데이터 형식을 사용하여 개발자가 응용 프로그램을 제공하는 데 초점

  • Visual Studio.NET의 강력한 설계 도구 지원

MTS/COM+ 응용 프로그램을 만들 경우 .NET Remoting은 다음을 제공합니다.

  • 네트워크를 통해 완전히 관리되는 코드 형식 시스템 성능

  • 네트워크에서 참조에 의해 개체를 전달하고 특정 프로세스의 특정 개체로 돌아가는 기능

  • 이진 통신

ATL/C++ 응용 프로그램을 만들 경우 ATL Server는 다음을 제공합니다.

  • 융통성 있는 제어 가능한 기본(C++) 솔루션

  • ATL Server ISAPI 웹 응용 프로그램 아키텍처 위에 구축(스레드 풀, 캐시 등 사용)

웹 개발 도구로 SOAP 사용

ASP.NET 웹 서비스는 웹 서비스를 쉽게 만들고 사용할 수 있는 RAD 방식을 제공합니다. 이 서비스는 느슨하게 결합되어 있으며 ASP.NET과의 강력한 통합을 제공합니다. ASP.NET 웹 서비스는 웹 개발자가 인터넷에 웹 서비스를 제공하는 기본 방법입니다. 목표는 빠르고 쉬운 고성능 SOAP 서비스를 제공하는 것입니다.

ASP.NET 웹 서비스는 ASP.NET HTTP 엔진과의 강력한 통합을 제공합니다. 이것은 Microsoft 웹 개발 기술에 대해 경험이 있는 개발자가 SOAP 기반 웹 서비스를 쉽게 만들고 사용할 수 있도록 해줍니다.

ASP.NET는 .asmx 파일로 웹 서비스 지원을 제공합니다. .asmx 파일은 .aspx 파일과 유사한 텍스트 파일입니다. 이 파일은 .aspx 파일을 포함하는 ASP.NET 응용 프로그램의 일부가 될 수 있으며 .aspx 파일과 마찬가지로 URI 주소 지정이 가능합니다.

다음은 .asmx 파일의 간단한 예제입니다.

<%@ WebService Language="C#" Class="HelloWorld" %>

using System;
using System.Web.Services;

public class HelloWorld : WebService {

     [WebMethod] public String SayHelloWorld() {
          return "Hello World";
     }

}

이 파일은 ASP.NET 지시 웹 서비스로 시작하고 C# 언어로 설정합니다. Microsoft Visual Basic®, C 또는 약 30개의 타사 언어로 설정할 수도 있습니다. 다음은 이름 공간 System.Web.Services를 가져옵니다. 이 이름 공간은 필요하므로 반드시 포함해야 합니다. 다음에는 클래스 HelloWorld를 선언합니다. 이 클래스는 기본 클래스 WebService에서 파생됩니다. 마지막으로, 서비스의 일부로 액세스할 수 있는 메서드는 서명 앞에 있는 사용자 지정 속성[WebMethod](또는, Visual Basic의 <"WebMethod()>")을 가집니다.

이 서비스를 사용하려면 HelloWorld.asmx 파일로 명명하고 이 파일을 가상 디렉터리 Bar의 서버 Foo에 저장하십시오. 모든 HTML 3.2(또는 이후 버전) 브라우저를 사용하여 URL http://Foo/Bar/HelloWorld.asmx를 입력할 수 있고 결과 페이지에는 이 웹 서비스(WebMethod 속성으로 표시)에 대한 공용 메서드 뿐만 아니라 이 메서드를 호출하는 데 사용할 수 있는 프로토콜(예: SOAP, HTTP GET)도 표시됩니다. Internet Explorer 주소 입력란에 http://Foo/Bar/HelloWorld.asmx?SDL을 입력하여 WSDL(Service Description Language) 문법에 기초한 XML 파일과 동일한 정보를 만듭니다. 이 WSDL 파일은 서비스를 액세스하는 클라이언트가 사용하며 매우 중요한 파일입니다.

 

웹 서비스 액세스

개발자에게 웹 서비스를 만드는 기술을 제공하는 것 이외에도 Microsoft .NET 프레임워크는 고급 도구 및 코드를 제공하여 클라이언트로 액세스하거나 웹 서비스를 사용할 수 있습니다. 웹 서비스는 SOAP(Simple Object Access Protocol) 및 HTTP와 같은 개방형 프로토콜을 기반으로 하기 때문에, 이 클라이언트 기술은 ASP.NET 이외의 웹 서비스에도 사용될 수 있습니다.

SDK와 함께 WebServiceUtil.exe("웹 참조 추가"를 사용하여 VS IDE에서 자동으로 실행)라는 도구가 있습니다. 이 프로그램은 웹 서비스의 WSDL 설명을 다운로드하고 이 서비스를 제공하는 프록시 클래스를 만드는 데 사용할 수 있습니다. 예를 들어 다음과 같이 입력할 수 있습니다.

WebServiceUtil /c:proxy /pa:http://someDomain.com/someFolder/HelloWorld.asmx?SDL

다음에 프록시 클래스 HelloWorld.cs가 만들어집니다.

이 클래스는 이전 항목에서 만든 클래스와 매우 유사하며 문자열을 반환하는 메서드 SayHelloWorld를 포함합니다. 이 프록시 클래스를 응용 프로그램으로 컴파일한 후 메서드를 호출하면 프록시 클래스는 HTTP를 통해 SOAP 요청을 패키지로 만들며 SOAP 인코딩된 응답을 받은 다음 문자열로 마샬링됩니다.

클라이언트 관점에서 코드는 간단합니다.

Dim myHelloWorld As New HelloWorld()
Dim sReturn As String = myHelloWorld.SayHelloWorld()

반환값은 "Hello World"입니다.

구성 요소 개발 도구로 SOAP 사용

Microsoft .NET Remoting은 높은 수준의 제어가 필요하고 밀접한 결합 또는 느슨한 결합 중에 선택하려는 개발자에게 분산 응용 프로그램을 만들수 있도록 합니다.

또한, 공통 언어 런타임과의 강력한 통합을 제공하고 개발자에게 전선을 통한 전체 형식 시스템 성능을 제공합니다. 여기에는 생성자, 대리인, 오버로드된 메서드, 참조와 값으로 전달되는 개체, 클래스 계층 구조, 인터페이스, 메서드, 속성, 필드, 플러그형 채널을 사용하여 전선상 응용 프로그램(웹 서비스) 간의 값에 의한 마샬링(복사)과 참조에 위한 마샬링(ObjRef 전달) 개체, 분산 ID, 활성화, 임대 기반의 작동 기간 및 CallContext(매개 변수에 독립적인 SOAP 헤더의 플로우 개체)가 포함되어 있습니다.

.NET Remoting을 사용하여 개발자는 콘솔 응용 프로그램, GUI 응용 프로그램, NT 서비스 및 IIS를 포함하는 모든 프로세스에서 Remoting 종점을 공개할 수 있습니다. 이것은 모든 페이로드 인코딩(제품에서 제공되는 SOAP 및 이진 서식 프로그램과 함께 플러그형 순차 가능 서식 프로그램)을 사용하여 모든 전송(플러그형 채널)에서 발생합니다. SOAP=HTTP+XML은 HTTP 및 SMTP 통해 SOAP 1.1을 지원함으로써 쉽게 사용할 수 있습니다.

웹 서비스 및 전체 런타임 형식 시스템 성능을 설명하기 위해 WSDL을 지원합니다. .NET Remoting은 관리된 클래스 및 COM 개체의 메타데이터에서 서비스 설명을 생성하는 도구를 .NET SDK에서 제공합니다. 이 도구는 서비스 설명을 사용하고 메타데이터와 프록시를 생성합니다. 풍부한 차단 모델을 제공하여 개발자는 응용 프로그램에서 메시지 흐름 인바운드 및 아웃바운드로 동작을 연결할 수 있습니다. 작업을 시작하려는 사람들에게는 이진 인코딩의 TCP 채널(소켓 사용)이 제공됩니다.

.NET Remoting은 관리된 구성 요소, 기본 COM/COM+ 구성 요소 및 서비스되는 구성 요소(COM+ 서비스에 의해 서비스되는 관리된 구성 요소)를 원격 관리합니다. 이것은 SOAP, 이진 및 모든 플러그형 채널과 형식을 통해 발생합니다.

예제: SOAP을 통해 관리된 코드 이벤트

다음 코드는 두 응용 프로그램 사이에 관리된 코드 이벤트를 발생하는 방법을 나타냅니다. 클라이언트는 원격 개체로 이벤트 알림에 대해 등록하는 로컬 이벤트를 가지고 있습니다. 서버 개체가 호출되면 이벤트를 발생되고 클라이언트의 로컬 개체에 콜백합니다.

서버 측

zap.cs
using System;

namespace Zap
{
  // 이벤트 인수를 정의합니다.
  public class GreetingEventArgs : EventArgs
  {
    public GreetingEventArgs(string greeting)
    {
      this.greeting = greeting;
    }

    public string greeting;
  }

  // 이벤트를 정의합니다.
  public delegate void GreetingEvent(object sender, 
GreetingEventArgs e);

  // 서비스를 정의합니다.
  public class Waz : MarshalByRefObject
  {
    // 클라이언트는 이 이벤트에 대해 
    // 가입하거나 가입 취소합니다.
    public event GreetingEvent Greeting;

    // 클라이언트에 의해 원격으로 호출되는 메서드
    public void HelloMethod(string greeting)
    {
      Console.WriteLine("Received String {0}", greeting);

      // GreetingEventArgs의 패키지 문자열
      GreetingEventArgs e = new GreetingEventArgs(greeting);

      // 이벤트 발생
      if (Greeting != null)
      {
        Greeting(this, e);
      }
    }
  }
}

host.cs

using System;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;

public class Host
{
  public static void Main(string[] args)
  {
    // http 채널을 수동으로 로드합니다. 
    // 원격 구성 파일에서 수행할 수도 있습니다.
    ChannelServices.RegisterChannel(new HTTPChannel(999));

    // 잘 알려진 서버 유형을 등록합니다. 
    // 원격 구성 파일에서 수행할 수도 있습니다.
    RemotingServices.RegisterWellKnownType(
              "Zap",                          // 어셈블리
              "Zap.Waz",                      // 전체 유형 이름
              "host/Waz.soap",                // URI
              WellKnownObjectMode.Singleton); // 개체 모드

    // 완료되었습니다. 사용자가 끝낼 때까지 기다리십시오.
    Console.WriteLine("호스트는 원격 메시지를 처리할 준비가 되었습니다.");
    Console.WriteLine("끝내려면 Enter를 누르십시오.");
    String keyState = Console.ReadLine();
  }
}

클라이언트 측

client.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;

using Zap;

// 이벤트가 발생된 곳에 Ref 개체로 
// 로컬 마샬링
public class Baz : MarshalByRefObject
{
  public void GreetingHandler(object sender, GreetingEventArgs e)
  {
    Console.WriteLine("GreetingHandler callback : Greeting : {0}\n", 
                        e.greeting);
  }
}

public class Client
{
  public static void Main(String[] args)
  {
    Baz baz = new Baz();

    // 원격 구성 파일로 수행될 수 있습니다.

    // HTTP 채널을 등록합니다.
    ChannelServices.RegisterChannel(new HTTPChannel(0));

    // SOAP URL에 대한 프록시를 가져옵니다.
    Waz waz = (Waz)Activator.GetObject(
                              typeof(Waz),
                              "http://localhost:999/host/Waz.soap"
                              );


    // 이벤트 등록 : SOAP에 대해 발생
    waz.Greeting += new GreetingEvent(baz.GreetingHandler);

    for (int i = 0; i < 5; i++)
    {
      // SOAP에 대해 발생
      waz.HelloMethod("Bill" + " " + i);
    }

    // 이벤트 등록 해제 : SOAP에 대해 발생
    waz.Greeting -= new GreetingEvent(baz.GreetingHandler);
  }
}

Makefile

makefile

all: Host.exe Zap.dll Client.exe

Host.exe: Host.cs
 csc /r:System.Runtime.Remoting.dll Host.cs

Zap.dll: Zap.cs
  csc /t:library -out:Zap.dll Zap.cs
 
Client.exe: Zap.dll Client.cs
 csc /r:System.Runtime.Remoting.dll /r:Zap.dll Client.cs

하나의 창에서 host.exe를 시작하고 다른 창에서 client.exe를 시작합니다. 발생한 이벤트가 클라이언트로 되돌아가는 것을 볼 수 있습니다.

이것은 네트워크를 통해 CLR이 완전히 관리하는 코드 형식 시스템을 제공하는 .NET Remoting 응용 프로그램의 한 예입니다. 또한 .NET Remoting은 SOAP 1.1과 완전히 호환되므로 뛰어난 SOAP 서버 및 클라이언트입니다.

ATL 개발 도구로 SOAP 사용

ATL Server 웹 서비스는 C++ 개발자들에게 원시 코드로 웹 서비스를 만들고 사용할 수 있는 간편한 방법을 제공합니다. ATL Server는 C++ 개발자들이 인터넷에서 웹 서비스를 제공하고 사용할 때 선호하는 방법입니다. ATL Server는 SOAP 서비스를 포함하는 웹 응용 프로그램을 위해 신속하고 가벼우며 매우 유연성 있는 라이브러리를 제공하기 위해 설계되었습니다.

ATL Server는 고성능 및 유연성을 목적으로 ATL을 내장했기 때문에 ATL 이름을 사용합니다. 예를 들어, ATL Server 마샬링/프로토콜 코드의 이점을 여전히 사용하면서도 쉽게 ATL Server HTTP 모델을 제거하여 고유한 디스패처를 작성할 수 있습니다.

ATL Server 웹 서비스는 인터페이스를 기술하는 데 COM과 같은 구문을 사용하여 ATL 개발자들이 쉽게 배울 수 있도록 합니다. 이러한 COM 방식의 구문을 사용하면 개발자들은 COM 개체인 동시에 웹 서비스로서 개체를 쉽게 제공할 수 있습니다.

특성의 도입으로 코드가 상당히 간소화되어 ATL 개발자들이 아니라도 훨씬 쉽게 사용할 수 있습니다. ATL Server는 다른 모든 .NET 웹 서비스와 상호 운영할 수 있도록 설계되어 한 응용 프로그램에서 많은 기술을 더 쉽게 사용할 수 있습니다.

인터페이스 새 인터페이스 키워드는 개발자들이 COM 개체 또는 웹 서비스를 위한 인터페이스를 쉽게 만들 수 있도록 해줍니다.

[
   uuid("D7DAE6FD-AEBB-4579-BD8D-866F74139501"), 
   object
]
__interface IWeb_Service_ExampleService
{
   [id(1)] HRESULT HelloWorld([in] BSTR bstrInput, [out, retval] BSTR *bstrOutput);
};

ATL Server는 이를 통해 웹 서비스 인터페이스를 정의하도록 합니다. C++ 특성, 인라인 IDL 특성 및 새로운 __interface 키워드 사용을 통해 ATL Server 웹 서비스 인터페이스는 COM 인터페이스의 새 특성 버전과 매우 비슷합니다. 여기에 웹 서비스 인터페이스 예인 IWeb_Service_ExampleService가 있으며 이 인터페이스는 단일 메서드 HelloWorld를 구현합니다. HelloWorld는 입력으로 BSTR을 취하고 출력으로 BSTR을 반환합니다.

요청 처리기 요청 처리기는 처리기 맵을 통해 제공되고 교체 메서드 맵을 통해 표시되는 메서드를 가진 C++ 클래스입니다. 처리기 맵은 단지 텍스트 태그와 클래스의 이름 간의 매핑이며 메서드 맵은 단지 텍스트 태그와 클래스의 메서드 간의 매핑입니다.

 [
   request_handler(name="Default",sdl="GenWeb_Service_ExampleServiceSDL"),
   soap_handler(
      name="Web_Service_ExampleService", 
      namespace="urn:Web_Service_ExampleService",
      protocol="soap"
   )
]
class CWeb_Service_ExampleService:
   public IWeb_Service_ExampleService
{
public:
   
   [ soap_method ]
   HRESULT HelloWorld(BSTR bstrInput, BSTR *bstrOutput)
   {
      CComBSTR bstrOut(L"Hello ");
      bstrOut += bstrInput;
      bstrOut += L"!";
      *bstrOutput = bstrOut.Detach();
      
      return S_OK;
   }
}; 

ATL Server 요청 처리기 모델은 웹 응용 프로그램 및 웹 서비스와 매우 비슷합니다. 그림 1은 요청 처리 모델을 보여 줍니다.

그림 1. ATL Server 요청 처리기 모델

HTTP 요청이 IIS에 들어오면 IIS는 URL 및 확장 기반 요청을 적합한 ISAPI DLL로 매핑합니다. 그 다음, ISAPI DLL은 요청에서 지정한 처리기(처리기는 태그 또는 쿼리 매개 변수로 지정)를 적합한 응용 프로그램 DLL로 매핑합니다. 응용 프로그램 DLL은 이 처리기를 C++ 개체로 매핑합니다. 이 모델(ATL Server 모델)에서 웹 응용 프로그램과 웹 서비스 간의 유일한 차이점은 이 마지막 단계에 있습니다. 웹 서비스에서 C++ 개체는 SOAP를 디코딩 및 인코딩할 수 있습니다(컴파일러는 soap_handler 특성을 구문 분석할 때 이 작업을 수행하는 코드를 삽입합니다).

클래스가 인터페이스를 상속받으며, SOAP 요청을 처리할 HelloWorld메서드를 나타내기 위해 [soap_method] 특성을 사용한다는 것을 알 수 있습니다. 다른 모든 C++ 메서드와 마찬가지로 이 메서드를 구현합니다.

또한 soap_handler 특성은 서비스를 설명하는 유효한 WSDL를 자동으로 만듭니다. 이러한 서비스(XML/WSDL 형식) 설명은 웹 서비스의 소비자들이 올바른 형식으로 된 정확한 데이터를 보내고 받을 수 있도록 하기 위해 사용됩니다.

ATL Server로 웹 서비스 사용

또한, ATL Server로 웹 서비스를 사용하는 것은 상대적으로 간단한 작업입니다. 개발자들이 다른 형식의 웹 참조를 사용하는 것과 마찬가지로 개발자는 "웹 참조 추가" 대화 상자(여기서 .disco 파일을 가리킨 다음 WSDL을 선택)를 사용하면 됩니다. 이 대화 상자는 웹 서비스 WSDL(.NET 웹 서비스가 아닌 경우에는 다른 유틸리티 사용)에서 sproxy.exe 유틸리티를 실행합니다.

이러한 작업은 요청된 웹 서비스를 이용하기 위해 필요한 모든 C++ 코드를 포함하는 웹 서비스 프록시 파일을 만듭니다. WSD에서 정보를 사용하면, 프록시 생성기는 웹 서비스가 받을 것과 클라이언트에게 반환하는 방법을 알고 있으므로 웹 서비스에 "말할 수 있는" 헤더 파일을 만들 수 있습니다.

사용자는 Web Service 클래스(생성된 헤더 파일에서 볼 수 있음)의 인스턴스를 만들어 다음과 같이 적합한 메서드를 사용하면 됩니다.

CWeb_Service_ExampleServiceService MyService;
CComBSTR bstrOut;
CComBSTR bstrIn(L"World");
MyService.HelloWorld ( bstrIn ,&bstrOut,);
wprintf(bstrOut);

이렇게 하면 기본 ATL Server 웹 서비스 및 기본 ATL Server 웹 서비스 소비자를 얻게 됩니다.

결론

이 기사의 첫 번째 목적은 .NET Framework 및 Visual Studio.NET에서 제공하는 폭넓은 사용이 예상되는 SOAP를 설명하는 것이고 두 번째 목적은 SOAP를 사용하여 구축된 응용 프로그램을 시작할 때 고객들이 이용할 경로에 대한 로드맵을 제공하는 것입니다.