6.4.2 WebRobot 서비스 만들기

WebRobot 서비스는 윈도우즈 서비스로 만들게요. Windows 서비스 프로젝트를 추가하세요. 여기서는 WebRobotSVC라 정할게요.

디자인 창에서 마우스 우측 버튼 클릭 시 나오는 컨텍스트 메뉴에서 설치 관리자를 추가하세요.

설치 관리자 추가화면
[그림 6.3] 설치 관리자 추가화면

 그리고 서비스 프로세스 인스톨러의 속성 중에 Accout를 LocalService로 설정합니다. 이는 윈도우즈 서비스를 등록할 계정을 설정하는 것입니다.

그리고 서비스 인스털러 속성 창에서 서비스 이름과 설명 및 화면 표시 이름을 설정하세요. StartType은 관리 도구의 서비스를 이용하여 변경할 수 있으므로 여기에서는 디폴트 값인 Manual로 할게요.

서비스 인스톨러 속성 창
[그림 6.4] 서비스 인스톨러 속성 창

마법사에 의해 기본으로 제공한 서비스 파일명을 SVCWebRobot으로 변경하세요. 자동으로 클래스 이름이 변경한 이름으로 바뀝니다.

public partial class SVCWebRobot : ServiceBase
{

}

여기에서는 .NET 리모팅을 사용할 것이므로 System.Runtime.Remoting 어셈블리 참조 추가하세요. 그리고 .NET 리모팅에서 제공할 형식을 제공하는 GenericWebRobotLib 어셈블리로 참조 추가합니다.

서비스를 시작하면 OnStart 메서드의 코드부터 출발합니다. 따라서 .NET 리모팅 서비스를 위해 채널 생성 및 등록과 GenericWebRobot 형식을 서비스 형식으로 등록하는 작업을 OnStart 메서드에 작성하세요.

protected override void OnStart(string[] args)
{
    HttpChannel hc = new HttpChannel(10400);
    ChannelServices.RegisterChannel(hc, false);
    RemotingConfiguration.RegisterWellKnownServiceType(
        typeof(GenericWebRobot),
        "WebRobotSVC",
        WellKnownObjectMode.Singleton
        );
}

GenericWebRobot에서는 WebRobotLib 어셈블리를 동적으로 로딩하여 리플렉션을 이용하였으므로 WebRobotLib 프로젝트의 출력 폴더(일반적으로 Bin이나 Debug 폴더)에 있는 어셈블리 관련 파일들을 복사하여 WebRobotSVC의 출력 폴더에 붙여 넣습니다.

WebRobotLib 프로젝트의 출력 폴더에는 WSECore, DBMForAllLib, WebRobotLib 관련 파일들이 있습니다. 이들 파일을 복사하여 붙여 넣으세요.

프로젝트를 빌드 한 후에 서비스를 설치해야 합니다.

윈도우즈 서비스를 등록하려면 명령 프롬프트를 관리자 권한으로 실행한 후에 콘솔 명령어 installutil을 이용하여 설치할 수 있습니다.

설치할 때는 installutil 뒤에 서비스파일명을 입력합니다.

installutil [서비스파일명]

제거할 때는 installutil 뒤에 -u 옵션을 추가합니다.

installutil -u [서비스파일명]

윈도우즈 서비스 설치화면
[그림 6.5] 윈도우즈 서비스 설치화면

윈도우즈 서비스를 설치하였으면 제어판의 관리도구에서 서비스를 실행하면 설치한 서비스를 설정할 수 있습니다.

관리도우의 서비스를 실행한 후에 설치한 웹 수집 로봇을 시작하세요.

웹 수집 로봇 시작하기
[그림 6.6] 웹 수집 로봇 시작하기

▷ SVCWebRobot.cs

using System.ServiceProcess;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
using GenericWebRobotLib; 
namespace WebRobotSVC
{
    public partial class SVCWebRobot : ServiceBase
    {
        public SVCWebRobot()
        {
            InitializeComponent();
        } 
        protected override void OnStart(string[] args)
        {
            HttpChannel hc = new HttpChannel(10400);
            ChannelServices.RegisterChannel(hc, false);
            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(GenericWebRobot),
                "WebRobotSVC",
                WellKnownObjectMode.Singleton
                );
        } 
        protected override void OnStop()
        {
        }
    }
}