본문 바로가기

Dev/.NET

Integrating WCF Services with COM+

http://msdn.microsoft.com/en-us/library/bb978523.aspx
http://msdn.microsoft.com/en-us/library/bb735856.aspx


WCF의 COM+ 통합서비스

쉽게 얘기해서 COM+의 서비스를 종전의 DCOM이나 RDS처럼 WCF 여러 채널(바인딩)을 통해서 서비스 하는 방법이다

Binding

Interoperability

Transactions

Encoding

BasicHttpBinding

Basic Profile 1.1

(None)

Text, (MTOM)

WSHttpBinding

WS

(None), Yes

Text, (MTOM)

WSDualHttpBinding

WS

(None), Yes

Text, (MTOM)

WSFederationHttpBinding

WS-Federation

(None), Yes

Text, (MTOM)

NetTcpBinding

.NET

(None), Yes

Binary

NetNamedPipeBinding

.NET

(None), Yes

Binary

NetMsmqBinding

.NET

(None), Yes

 

NetPeerTcpBinding

Peer

(None)

 

MsmqIntegrationBinding

MSMQ

(None), Yes

 


여기서 WSHttpBinding과 BasicHttpBinding 과 같은 경우는 IIS를 통해서 지원을 하고,
NetTCPBinding 과 같은 경우는 COM+를 통해서 호스팅이 가능 하도록 설계되어 있다
물론 WAS(IIS 7.0)의 경우 모두 호스팅이 가능할 것으로..
(COM+ 통합의 경우 셀프 호스팅은 아직 안해봐서 모르겠다..)



WCF의 COM+ 통합서비스를 하려면 다음과 같은 도구가 필요하다

- .NET Framework 3.0 (or 3.5 ) (3.5를 설치하면 3.0, 2.0 등이 모두 설치된다.) - 3.5 권장..
- SvcConfigEditor.exe (Service Configuration Editor) 혹은 ComSvcConfig.exe

ComSvcConfig.exe는 .NET Framework 3.0와 함께 제공되며 커맨트 툴로 COM+의 WCF의 구성을 돕는다.
허나 .NET SDK로 제공되는  SvcConfigEditor.exe를 이용하면 Visual 한 환경으로 WCF 구성파일 편집, 생성및 COM+을 쉽게 구성할수 있다.

* ComSvcConfig.exe : http://msdn.microsoft.com/ko-kr/library/ms732009.aspx



구성 방법

1. 우선 만들어진 컴포넌트(VC++ ATL 간단하게 만들었다)를 COM+에 패키지를 생성하여 추가한다.

2. SvcConfigEditor.exe를 실행하여 "파일->통합->COM+응용프로그램" 메뉴를 선택
- COM+의 패키지의 컴포넌트 인터페이스를 선택
- 컴포넌트의 메서드 선택
- COM+ 호스팅 선택
- TCP를 선택
- 서비스 주소 세팅 (ex: net.tcp://localhost:9000/Simple)
- 완료

3. 2번과 같이 세팅이 완료된 경우 COM+의 해당 패키지의 등록정보-활성화 탭의 "응용 프로그램 루트 디렉토리"란에 WCF 설정파일이 생성된 디렉토리 경로가 세팅된다.
ex: C:\Program Files\ComPlus Applications\{593add39-f66f-442a-a901-01379dbac4eb}\

4. 그리고 netstat 로 확인을 해보면 hosting 이 되어 있는걸 확인할 수 있다.

C:\>netstat -an | findstr 9000
  TCP    0.0.0.0:9000           0.0.0.0:0              LISTENING


위의 방법 이외에 웹호스팅으로도 선택하여 IIS를 통하여 서비스 하는것도 가능하며,
웹호스팅의 경우 웹사이트및 가상디렉토리를 선택하면 해당 디렉토리에 WCF구성파일을 생성해준다
(.svc 과 web.config)



테스트

위와같이 세팅이 되어 있다면 Visual Studio 2005 (Extensions for WPF and WCF 설치)나 Visual Studio 2008을 이용하여 테스트 가능하다

SvcUtil.exe 과 같은 툴로 스켈레톤 코드를 생성하여 포함시켜 사용해도 되고 VS 2008의 경우 서비스 참조를 하면 자동으로 생성을 해준다.

그리고 참조된 객체를 생성할때 생성자의 파라미터로 app.config에 설정되어 있는 endpoint 중에 하나를 선택하여 그 이름을 세팅하면 해당 endpoint를 이용하여 Communicaiton(통신)를 하게 된다.

using (Simple.SimpleClient s = new Simple.SimpleClient("NetTcpBinding_ISimple"))
{
    int nResult = (int)s.Add(50, 58);
    Console.WriteLine("result = {0}", nResult);
}


그러나 처음 실행하면 다음과 같은 오류를 뱉어낸다.

통신 개체 System.ServiceModel.Channels.ServiceChannel은(는) Faulted 상태이기 때
문에 통신에 사용할 수 없습니다.

이유는 COM+의 해당 패키지를 호스팅하는 프로세스가 객체를 자동 활성화 시키지 못해서 그런것 같다.
그러나 이미 활성화가 되어 있는 경우는 문제 없다.
어떻게 활성화를 자동으로 시킬지는 알아봐야 할듯...

* 이벤트로그 내용

COM+: COM 인스턴스를 만드는 동안 오류가 발생했습니다.
 원본:
 App ID: 593add39-f66f-442a-a901-01379dbac4eb
 CLSID: 9833d2b6-d279-4bc3-b9be-7a4194c4a1b2
 들어오는 트랜잭션 ID: 00000000-0000-0000-0000-000000000000
 서로게이트: CDECL-DESK\cdecl
 요청 ID: System.Runtime.InteropServices.COMException (0x80070542): 적어도 클라이언트 토큰은 Out of process Webhost 활성화를 위한 최소 가장의 SecurityImpersonationLevel을 갖고 있어야 합니다.
   위치: System.ServiceModel.ComIntegration.ComPlusInstanceProvider.GetInstance(InstanceContext instanceContext, Message message)
 예외: aspnet_wp
 프로세스 이름: 22228
 프로세스 ID: %9



위의 이유에서인지 MS에서는 WCF 서비스 형태로도 제공되는 COM+의 경우 해당 패키지를 서비스 형태로 실행하는 방법에 대해서 제시를 한다.

     서비스 COM+ 패키지 -> 등록정보 -> 활성화 탭 ->  "NT서비스로 응용프로그램 실행"

서비스 형태로 등록을 한 후 해당 패키지를 중지->시작 을 하면 서비스 형태로 실행이 되어 시스템 재시작 후에도 문제가 없다고 하는데...


기타

WCF의 COM+ 통합서비스를 하기 위해서는 XP및 Windows 2003 서버에 아래의 업데이트를 설치를 해줘야 한다.

Windows Communication Foundation용 업데이트(KB912817)

간략한 설명 :
MSDTC의 WS-AtomicTransaction 프로토콜에 대한 지원과 WCF(Windows Communication Foundation) COM+ 통합 기능에 대한 지원을 추가합니다.


'Dev > .NET' 카테고리의 다른 글

SerializeToXML - C#  (0) 2009.08.10
C# Web Service -> REST  (0) 2009.08.09
Integrating WCF Services with COM+  (0) 2008.09.03
Interop 응용 프로그램 배포  (0) 2007.10.05
RCW, CCW  (0) 2007.10.04
"The underlying connection was closed" - WebServices  (0) 2005.10.13