2009년 2월 9일 월요일

[WCF Step by Step] 02. WCF 서비스 호스팅 - 윈도우즈 호스팅

WCF 서비스를 호스팅하는 방법은 3가지가 있다.
 
1. IIS 호스팅

   IIS로 호스팅 하기 위해서 WCF 프로젝트를 새 웹페이지의 WCF 서비스 템플릿을 사용해되 되지만

   Chapter01 예제처럼 WCF 서비스 라이브러리로 작성한 후 Service definition file(svc) 을 이용하여

   IIS 가상 디렉토리에 호스팅하는 방법이 있다.

 

   개인적인 취향이겠지만 WCF 서비스 라이브러리로 작성하는것이 좀더 유연하게 사용할 수 있다고 생각된다.

   라이브러리로 작성된 서비스는 IIS 호스팅뿐 아니라 Self 호스팅, 그리고 Windows Service 호스팅에 모두 같이 사용할 수 있고

   해당 라이브러리를 불러와서 간단한 실행 테스트 프로그램도 만들수 있기에 WCF 서비스 라이브러리로 만들기를

   적극 추천한다.

 

2. Self 호스팅
   Chapter02 에서와 같이 별도의 응용프로그램에서 호스팅하는 방법이다.
 
3. Windows Service 호스팅
   Self 호스팅이지만 호스팅 응용프로그램을 윈도우즈 서비스 프로그램으로 작성하여 호스팅하는 방법으로
   서비스에 등록하여 실행하므로 시스템이 재부팅시 자동으로 실행되는지 여부와 시작/종료를 서비스에서 관리할 수 있다.
 
 
* Windows Service Hosting Application
 
1. 솔루션 >> 추가 > 새 프로젝트 > Windows 서비스 선택한 후 프로젝트 이름은 WindowsProductsService 로 새로운 프로젝트를 Chapter02 솔루션에 추가한다.
 
 
 
2. Service1.cs 파일을 ServiceHostController.cs 파일로 이름을 바꾼다.
 
 
 
3. 참조 >> 참조 추가 를 선택하여 Chapter01 에서 만들었던 서비스 라이브러리(ProductsService.dll)와 System.ServiceModel 을 참조에 추가한다.
 
 
 
4. 이전 예제에서 작선한 ProductsServiceHost 프로젝트에 포함된 app.config 를 추가한다. 같은 솔루션으로 만들었다면 ProductsServiceHost 프로젝트의 app.config 파일을 드래그&드롭 으로 복사할 수 있다.
 
5. App.config 파일의 내용을 Enterprise Library 의 DB 접속 정보를 제외하고 이전 서비스 내용을 모두 지워 다음과 같이 수정한다.
 
 <configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </configSections>
  <dataConfiguration defaultDatabase="AdventureWorksConnection" />
  <connectionStrings>
    <add name="AdventureWorksConnection" connectionString="Database=AdventureWorks;Server=(local)\SQLEXPRESS;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>
 
   이번 예제에서는 Config 파일에서가 아니라 프로그램에서 endpoint 를 추가하는 방법을 살펴볼 것이다.
 
 
6. ServiceHostController.cs 파일에 네임 스페이스를 추가한다.
 
using System.ServiceModel;
using Products;
 
 
7. 서비스에서 사용할 ServiceHost 를 선언한다.
 
private ServiceHost productsServiceHost;
 
8. ServiceHostController 클래스 생성자에 Windows Service 에 등록할 이름을을 Products Service 로 지정하고 서비스 관리 메뉴에서 서비스를 시작/종료 할 수 있도록 옵션을 설정하고 서비스의 동작을 윈도우즈 이벤트 로그에 남기도록 설정한다.
 

        public ServiceHostController()
        {
            InitializeComponent();

 

            this.ServiceName = "Products Service";
            this.CanStop = true;
            this.AutoLog = true;

        }

 
 
9. 서비스 시작시 ServiceHost 인스턴스를 생성하고 endpoint 를 추가한다.
 

        protected override void OnStart(string[] args)
        {
            productsServiceHost = new ServiceHost(typeof(ProductsServiceImpl));

 

            NetNamedPipeBinding binding = new NetNamedPipeBinding();
            productsServiceHost.AddServiceEndpoint(typeof(IProductsService), binding, "net.pipe://localhost/ProductsServicePipe");


            productsServiceHost.Open();
        }

 
   새로 추가한 endpoint 는 NetNamedPipeBinding 을 사용하였다. NetNamedPipeBinding은 같은 컴퓨에서 프로세스간 서비스를 제공할때 높은 성능을 보여주는 바인딩으로 네트워크를 통해서는 서비스에 접근할 수 없다. 주소는net.pipe://localhost/ProductsServicePipe 로 설정하였다. (WCF 바인딩 종류)
 
 
10. 서비스 종료를 작성한다.
 

        protected override void OnStop()

        {
            productsServiceHost.Close();

        }

 

 

11. ServiceHostController.cs 디자인 화면 >> 설치 관리자 추가 를 선택하면 ProjectInstaller.cs 파일이 생성되며serviceInstaller1serviceProcessInstaller1이 생성된다.

 

 

 

12. serviceInstaller1 의 ServiceName 속성을 ProductsService 로 수정하고 StartType 은 Automatic 으로 변경한다.

 

 

 

13. serviceProcessInstaller1 의 Account 속성을 LocalSystem 으로 수정한다.

 

 

 

14. 프로젝트를 빌드한다.

 

 

15. 시작 메뉴 > 모든 프로그램 > Microsoft Visual Studio 2005 > Visual Studio Tools > Visual Studio 2005 명령프롬프트 를 마우스 오른쪽 버튼으로 클릭하여 관리자 권한으로 실행한다. 서비스를 등록할 때에는 관리자 권한이 있어야 한다.

 

 

16. 명령 프롬프트에서 WindowsProductsService 프로젝트 폴더의 bin > debug 폴더로 이동하여 installutil 을 실행한다.

 

installutil windowsProductsService.exe

 

 
17. 내컴퓨터 >> 관리 > 서비스 및 응용프로그램 > 서비스 를 선택 한 후 오른쪽 패널의 리스트에서 ProductsService 서비스를 시작한다.
 
 
 
* Client 수정
 
1. NetNamedPipeBinding 을 Client 프로젝트의 app.config 에 다음과 같이 추가한다.
 

            <endpoint address="net.pipe://localhost/ProductsServicePipe"
                binding="netNamedPipeBinding" bindingConfiguration="" contract="ProductsClient.ProductsService.IProductsService"
                name="NetNamedPipeBinding_IProductsService" />

 
 
2. 프록시 클라이언트를 생성할때 NetNamedPipeBinding_IProductsService 를 지정한다.
 

ProductsServiceClient proxy = new ProductsServiceClient("NetNamedPipeBinding_IProductsService");

 
 
Windows Service 의 ProductsService 를 실행한 후 클라이언트 어플리케이션을 실행하면 결과를 확인 할 수 있다.
지금까지 WCF 서비스를 호스팅하는 방법과 다양한 Binding으로 endpoint 를 추가하여(app.config수정 혹은 AddServiceEndpoint 로 추가) 서비스를 제공하며 클라이언트에서 서비스를 호출하는 방법을 살펴보았다.

참조 : http://blog.naver.com/saeparam/90025529582

댓글 없음:

댓글 쓰기