정리 노트 랄까요.
대단한건 아닙니다. 마치 강의 시간 필기 노트의 그것처럼.
강의를 들으려고 Programming WCF 책을 지난 주말에 구입했습니다.
지금부터 그 노트를 공개해볼까 합니다.


1.     WCF 소개

: 윈도우 기반의 서비스를 개발하고 배포하기 위한 기술.

è  서비스 상호 작용.  커뮤니케이션 타입, 마샬링, 그리고 여러 프로토콜 관리 등을 정의하는 업계 표준의 마이크로소프트사의 구현.

: 여러 서비스들 간의 상호 운용성 제공.

è  호스팅, 서비스 인스턴스 관리, 비동기 호출, 신뢰도, 트랜잭션 관리, 비연결 큐 호출 기능 제공.

 

2.     서비스

: 외부에 노출되는 기능의 한 단위.

미리 규약 된 통신 패턴들만 통신으로 이용.

: 서비스와 클라이언트는 메시지(SOAP 구조)를 주고 받으며 서로 상호 작용.

    메시지? 웹 서비스와 달리 전송 프로토콜로부터 독립적.

 

è  HTTP 뿐만 아니라 다양한 프로토콜에서도 통신 가능

è  WCF 기반이 아닌 다른 서비스들과 통신 가능.

 

서비스의 구성? 외부에서 보았을 때는 불투명하기 때문에 WCF 서비스는 서비스에서 사용 가능한 기능과 통신 방식을 기술하는 메타 데이터를 이용하여 노출(서비스 제공).

-       메타 데이터는 미리 정의된 HTTP-GET 방식의 WSDL이나 메타 데이터 노출을 위해 업계 표준과 같은 기술로 배포.

 

3.     주소 (Address)

: 모든 서비스는 주소를 가지며, 이 주소는 서비스가 사용하고 있는 서비스 위치와 서비스의 전송 프로토콜인 전송 스키마 정보를 제공.

: 주소 포맷

[전송계층] : // [machine 혹은 domain] [ : 추가적인 포트] / [추가적인 URI]

http://localhost:8000

net.tcp://localhost:8002/MyService

net.msmq://localhost/private/MyService

 

읽는 방법? http://localhost:8001/MyService

è  HTTP 전송 계층을 사용하고 있고, localhost라는 이름을 갖는 머신의 8001번 포트의 MyService가 호출을 기다리고 있다.

 

: 지원 통신 스키마

è  HTTP, TCP, Peer network, IPC(명명된 파이프 위의 Inter-Process 통신), MSMQ

4.     계약 (Contract)

: 모든 서비스는 한 개 이상의 계약을 노출한다.

  계약? 서비스가 무엇을 하는지에 대해 플랫폼 중립적이고 표준적인 방식으로 설명하는 방법

 

종류

è  서비스 계약 (Service Contracts)

서비스에서 클라이언트가 어떤 동작들을 수행할 수 있는지를 설명

è  데이터 계약 (Data Contracts)

서비스와 주고받는 데이터 타입을 정의하는 계약

è  오류 계약 (Fault Contracts)

서비스로부터 어떤 에러가 발생하는지, 이 에러들을 서비스가 어떻게 처리하고 클라이언트에 전달하는지를 정의.

è  메시지 계약 (Message Contracts)

주고받을 메시지와 직접 상호 작용할 수 있게 해준다.

 

서비스 계약의 정의와 구현 예제

: ServiceContract를 사용했을 때 그 타입의 멤버를 노출하기 위해서 OperationContract를 메소드에 지정. (프로퍼티, 인덱스, 이벤트와 같은 CLR 타입에는 적용 불가)

[ServiceContract]

Interface IMyContract

{

   [OperationContract]

   String MyMethod(string text);

 

   // 계약에 포함되지 않는다.

   String MyOtherMethod(string text);

}

Class MyService : IMyContract

{

   Public string MyMethod(string text)

   {

      Return “Hello ” + text;

}

Public string MyOtherMethod(string text)

{

   Return “Cannot call this method over WCF”;

}

}


5.     호스팅

: 모든 WCF 서비스는 호스트를 제공하는 윈도우 프로세스 안에 호스팅 되어야 한다.

 

è  IIS 호스팅

클라이언트의 요청으로 프로세스가 자동적으로 실행되고 호스트 프로세스의 생명 주기를 IIS에서 관리

HTTP 전송 계층만 호스팅 가능할 수 있다는 단점.

 

CLR 코드

Public static void Main()

{

   Uri tcpBaseAddress = new Uri(“net.tcp://localhost:8001/”);

   Uri httpBaseAddress = new Uri(http://localhost:8002/);

 

   ServiceHost host = new ServiceHost(typeof(MySerivce), tcpBaseAddress,

httpBaseAddress);

}

 

설정파일 (Web.config App.config)

<system.serviceModel>

   <services>

      <service name=”MyNamespace.MyService”>

         <host>

            <baseAddresses>

               <add baseAddress=”net.tcp://localhost:8001/” />

<add baseAddress=”http://localhost:8002/” />

</baseAddresses>

         </host>

      </service>

   </services>

</system.serviceModel>

 

è  WAS 호스팅

IIS와 달리 HTTP에 한정되지 않고 다른 여러 WCF 통신 및 포트를 사용 할 수 있다.

(애프릴케이션 풀링, 재사용, idle time 관리, identity 관리, 분리)  

 

6.     바인딩 (Binding)

: 서비스는 여러 가지 관점과 많은 패턴을 가지고 있다.

è  메시지의 경우 동기 방식의 request/reply 나 비동기 방식의 fire-and-forget 방식을 이용할 수 있고, 양방향 통신이나 여러 가지 큐 기반의 통신이 존재..

è  HTTP, TCP, P2P, IPC, MSMQ와 같은 여러 전송 계층 이용

è  성능을 위해 바이너리 인코딩 사용

è  큰 용량의 데이터를 위해 MTOM 방식 사용

위와 같은 선택들을 간단하게 하고 더 편하고 효율적으로 관리하기 위해서 바인딩 제공.

, 전송 계층, 메시지 인코딩, 통신 패턴, 신뢰도, 보안, 전파, 상호 운용성과 같은 항목들을 조합한 설정.

 

표준 바인딩

è  Basic 바인딩

BasicHttpBinding 클래스. 기본적인 ASMX 웹 서비스와 같은 WCF 서비스를 노출하도록 설계. (옛 클라이언트들이 새 서비스를 사용할 수 있도록 설계)

è  TCP 바인딩

NetTcpBinding 클래스. 신뢰도, 트랜잭션, 보안 제공. WCF-to-WCF 통신에 최적화.

è  Peer network 바인딩

NetPeerTcpBinding 클래스. Peer 네트워크가 가능한 클라이언트와 서비스들은 동일한 그리드에 접속하여 메시지를 브로드캐스팅 방식으로 전송.

è  IPC 바인딩

NetNamedPipeBinding 클래스. 같은 머신 안에서 명명된 파이프 계층 이용. (밖에서 호출 X, 안전한 바인딩)

è  WS 바인딩

WSHttpBinding 클래스. HTTP 전송 계층 사용. 신뢰도, 트랜잭션, 보안 속성 제공

è  Federated WS 바인딩

WSFederationHttpBinding 클래스

è  Duplex 바인딩

WSDualHttpBinding 클래스. 양방향 통신을 제공. WS 바인딩과 같다.

è  MSMQ 바인딩

NetMsmqBinding 클래스. MSMQ 전송 계층을 사용하고 비연결 기반으로 큐를 호출 하는 것을 지원.

è  MSMQ integration 바인딩

MsmqIntegrationBinding 클래스. WCF 메시지를 MSMQ 메시지로 변환하여 MSMQ를 사용하는 다른 환경의 시스템과 상호 운용  

 

7.     엔드 포인트(끝점) => Address + Binding + Contract

: 모든 서비스는 서비스의 위치를 위한 주소(Address)와 통신 방법을 정의하고 있는 바인딩(Binding), 그 서비스가 무엇을 하는지를 정의하는 계약(Contract)으로 구성. WCF는 이 셋의 관계를 엔드 포인트(끝점)라는 형식으로 표현하고 위 3가지 요소로 구성.

 

: , 모든 엔드 포인트는 이 세가지 요소를 가지고 있어야만 하며, 호스트를 통해 노출된다. 또한, 모든 서비스는 최소한 하나의 엔드 포인트를 구성하여 노출해야 하며, 각각의 엔드 포인트는 정확한 하나의 계약을 가지고 있어야 한다.

 

CLR 코드

Public static void Main()

{

   Uri tcpBaseAddress = new Uri(“net.tcp://localhost:8001/”);

   Uri httpBaseAddress = new Uri(http://localhost:8002/);

 

   Binding wsBinding = new WSHttpBinding();

   Binding tcpBinding = new NetTcpBiding();

 

   // 트랜잭션 서비스 가능하게 설정.

   tcpBinding.TransactionFlow = true;

 

   // 다중 EndPoint 설정

   ServiceHost host = new ServiceHost(typeof(MySerivce));

   host.AddServiceEndpoint(typeof(IMyContract), wsBinding, httpBaseAddress);

   host.AddServiceEndpoint(typeof(IMyContract), tcpBinding, tcpBaseAddress);

  

   host.Open();

}

 

설정 파일

<system.serviceModel>

   <services>

      <service name=”MyNamespace.MyService”>

         <endpoint

            Address=”net.tcp://localhost:8000/MyService”

            BindingConfiguration=”TransactionalTCP”

            Binding=”netTcpBinding”

            Contract=”IMyContract”

         />

      </service>

   </services>

   <bindings>

      <netTcpBinding>

         <binding name=”TransactionalTCP” transactionFlow=”true” />

      </netTcpBinding>

   </bindings>

</system.serviceModel>

 

8.     메타 데이터의 교환

: 서비스는 HTTP-GET 방식을 이용하거나 메타 데이터 전용으로 만든 엔드 포인트를 사용하여 메타 데이터(Metadata)를 노출. (ServiceBehavior 설정에서 enable 속성을 설정하면 HTTP-GET 방식으로 메타 데이터를 자동으로 노출.)

 

CLR 코드

ServiceHost host = new ServiceHost(typeof(MyService));

 

ServiceMetadataBehavior metadataBehavior;

metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();

 

if(metadataBehavior == null)

{

   metadataBehavior = new ServiceMetadataBehavior();

   metadataBehavior.HttpGetEnabled = true;

   host.Description.Behaviors.Add(metadataBehavoir);

}

 

host.Open();

 

설정 파일

<system.serviceModel>

   <services>

      <service name=”MyService” behaviorconfiguration=”MEXGET”>

         <endpoint

            Address=”net.tcp://localhost:8000/MyService”

            BindingConfiguration=”TransactionalTCP”

            Binding=”netTcpBinding”

            Contract=”IMyContract”

         />

      </service>

   </services>

   <behaviors>

      <serviceBehaviors>

         <behavior name=”MEXGET”>

            <serviceMetadata httpGetEnabled = “true” />

         </behavior>

      </serviceBehaviors>

   </behaviors>

</system.serviceModel>

 

9.     클라이언트 프로그래밍

: 클라이언트가 서비스의 동작을 호출하기 위해서 먼저 서비스 계약을 보고 해석.

è  클라이언트가 WCF를 이용하고 있다면 일반적으로 프록시를 이용할 것

프록시? 서비스의 계약을 나타내고 단일 CLR인터페이스를 노출하는 클라이언트의 CLR 클래스 서비스에서 여러 개의 계약들을 지원하고 있다면 클라이언트는 각각의 계약에 매칭하는 프록시를 필요로 하게 된다. 또한 서비스의 게약과 같은 동작을 제공하며 서비스를 연결하고 프록시 생명 주기를 관리하기 위한 추가적인 메소드를 추가한다.

 

è  비주얼 스튜디오 [Add Service Reference…]

è  SvcUtil

SvcUtil http://localhost/MyService/MyService.scv /out:Proxy.cs

 

10.   CLR 코드와 설정 파일

: 이 두 가지 설정 방법은 상호 보완적이라 할 수 있다.

è  설정 파일

재빌드나 재배포 없이 서비스의 주요한 옵션을 변경할 수 있다.

단 타입이 안전하지 않다는 것과 컴파일이 아닌 런타임 시에 그 에러가 발생한다는 것이 문제점.

è  CLR 코드

해당 설정이 특정 조건, 현재 입력 값 등과 같은 런타임 시에만 알 수 있는 것들에 의해 결정되는 경우나 해당 설정이 한 번 정해지면 절대 바뀌지 않을 경우에 유용.

 

: CLR 코드는 동적으로 설정을 추가할 때 유용하며, 설정 파일은 정적이고 변하지 않을 경우에 유용하다. (대부분의 클라이언트와 서비스는 설정 파일을 자주 사용.) 

 

11.   채널 설정 작업

: 프록시 클래스를 이용하지 않고 서비스에서 동작 중인 채널들을 직접적으로 사용할 수 있다 -> ChannelFactory<T> 클래스는 필요할 때 바로 프록시를 생성하는 것이 가능

 

ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>();

 

IMyContract proxy1 = factory.CreateChannel();

Using(proxy1 as IDisposable)

{

   Proxy1.MyMethod();

}

 

IMyContract proxy2 = factory.CreateChannel();

Proxy2.MyMethod();

ICommunicationObject channel = proxy2 as ICommunicationObject;

Debug.Assert(channel != null);

Channel.Close();

 

12.   신뢰도

: 전송 계층의 신뢰도와 메시지의 신뢰도로 구분.

è  전송 계층의 신뢰도

패킷의 순서 그리고 패킷이 두 지점 간에 제대로 전달된다는 것을 네트워크 패킷 수준에서 보장. (중간에 끊기면 곧바로 대응하기 힘들다)

è  메시지 신뢰도

메시지를 배달하는 것에 대한 보증과 메시지의 순서에 대한 보증을 제공

연결이 끊겨 전송이 실패할 경우 다시 메시지를 전송.

메시지 버퍼링이나 플로 제어, 폭주와 같은 것들을 자동으로 관리.

연결을 확인하고 더 이상 필요하지 않을 경우 스스로 정리하는 등의 관리 기능 제공.

 

바인딩 이름

신뢰도 지원

신뢰도

기본지원

메시지

순서 보증

메시지 순서

기본 보증

BasicHttpBinding

No

N/A

No

N/A

NetTcpBinding

Yes

Off

Yes

On

NetPeerTcpBinding

No

N/A

No

N/A

NetNamedPipeBinding

No

N/A(On)

Yes

N/A(On)

WSHttpBinding

Yes

Off

Yes

On

WSFederationHttpBinding

Yes

Off

Yes

On

WSDualHttpBinding

Yes

On

Yes

On

NetMsmqBinding

No

N/A

No

N/A

MsmqIntegrationBinding

No

N/A

No

N/A

 

TCP 바인딩의 신뢰도 설정 예제

<system.serviceModel>

   <services>

      <service name=”MyService”>

         <endpoint

            Address=”net.tcp://localhost:8000/MyService”

            Binding=”netTcpBinding”

            bindingConfiguration=”ReliableTCP”

            contract=”IMyContract”

         />

      </service>

   </services>

   <bindings>

      <netTcpBinding>

         <binding name=”ReliableTCP”>

            <reliableSession enabled=”true” />

         </binding>

      </netTcpBinding>

   </bindings>

</system.serviceModel>

 

 

 

 

Posted by glycerine
,