VisualStudio/WCF

[WCF] Windows 서비스 호스팅을 사용하는 WCF 서비스 라이브러리

usingsystem 2023. 1. 3. 15:16
728x90
이 응용 프로그램을 샘플로 사용하면 누구나 WCF를 사용하여 n 계층 모델에서 응용 프로그램을 설계할 수 있습니다.

소개

일반적으로 우리는 WCF 서비스를 준비하고 IIS에서 호스트합니다. 이는 시스템 외부에서 서비스에 액세스하는 다른 클라이언트가 있을 때 유용합니다. 그러나 서비스가 로컬 시스템 클라이언트를 위한 것이라면 WCF 서비스를 Windows 서비스로 호스트하는 것이 좋습니다. 이 문서에서는 WCF 서비스를 만들고 Windows 서비스로 실행하는 방법을 살펴봅니다.

이 응용 프로그램을 샘플로 사용하면 누구나 WCF를 사용하여 n 계층 모델에서 응용 프로그램을 설계할 수 있습니다.

이를 위해 우리는 서비스가 한 위치에 상주하고 다른 위치에서 호스팅되고 다른 위치에서 소비되는 계층화된 아키텍처를 따릅니다.

우리가 할 일에 대한 명확한 이해를 위해 다음과 같은 의제가 있습니다.

  1. dll 파일에 서비스를 압축하는 WCF 서비스 라이브러리 만들기
  2. 테스트 호스트 환경을 사용하여 생성된 서비스 테스트
  3. 해당 환경에서 서비스 사용
  4. 서비스 dll을 Windows OS에 등록하여 Windows 서비스로 실행
  5. Windows 서비스로 실행되는 WCF 서비스 사용

우리의 주요 의도는 이러한 단계를 따르는 방법을 보여주는 것이므로 일을 덜 복잡하게 만들기 위해 정말 간단한 서비스를 준비하고 있습니다. 이 서비스는 기본 pubs 데이터베이스의 Jobs 테이블의 JobId를 가져오고 그 결과로 Job 설명 및 기타 데이터를 제공합니다.

따라서 많은 노력 없이 애플리케이션 구축을 시작합니다.

WCF 서비스 라이브러리 만들기

나. 새 WCF 서비스 라이브러리 만들기 및 서비스 추가

WCF 서비스 라이브러리 템플릿은 Visual Studio에서 새 프로젝트를 만드는 동안 WCF 프로젝트 형식 아래에 있습니다.

따라서 새 프로젝트 만들기 -> WCF 옵션으로 이동 -> WCF 서비스 라이브러리를 선택하고 이름을 지정합니다. 여기서는 이름을 WCFJobsLibrary로 지정합니다.

이렇게 하면 기본 서비스 인터페이스와 이를 구현하는 클래스가 있는 서비스 라이브러리가 생성됩니다. 필요하지 않으므로 간단히 삭제하고 고유한 사용자 지정 이름으로 서비스를 만듭니다. 이를 위해 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가 -> 새 항목을 선택한 다음 WCF 서비스를 선택합니다. 우리는 그것을 잡스라고 부릅니다.

이 단계에서는 IJobs 인터페이스와 Jobs클래스를 만듭니다. 또한 작업에 대한 서비스 구성은 Visual Studio에서 App.Config에 자동으로 작성됩니다. <behaviors>엔드포인트 세부 정보에 대한 <services> 태그와 아래의 서비스 동작에 대한 태그로 스크롤하면 이를 볼 수 있습니다 <system.serviceModel>.

기본적으로 두 개의 엔드포인트가 생성됩니다. 하나는 를 사용 wsHttpBinding하고 mex 엔드포인트는 mexHttpBinding. mex 끝점은 나중에 설명할 프로세스인 프록시 생성을 위해 클라이언트에 메타데이터를 제공합니다.

ii. 자체 복합 형식을 준비하고 직렬화 및 WCF 지원으로 만들기

바로 지금, 우리는 서비스를 위한 코드 작성을 진행할 것입니다. Jobs 클래스에서 Job 세부 정보가 포함된 복합 유형을 반환하는 메서드를 정의할 것입니다. 이 복잡한 유형의 경우 모든 필수 필드가 포함된 클래스를 준비해야 합니다. 따라서 추가 -> 새 항목에서 새 클래스를 추가하고 이름을 Job.cs로 지정합니다.

[DataContract]직렬화 가능하고 WCF를 사용할 수 있도록 클래스를 특성으로 지정해야 합니다 . 마찬가지로 속성은 속성으로 지정해야 [DataMember]합니다. 이러한 특성은 System.Runtime.Serialization기본적으로 클래스에서 사용할 수 없는 네임스페이스에 있으므로 해당 네임스페이스를 가져와야 합니다.

씨#
 
using System.Runtime.Serialization;
namespace WCFJobsLibrary
{
    [DataContract]
    public class Job
    {
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public int MinLevel{get;set;}
        [DataMember]
        public int MaxLevel { get; set; }
 
    }
}

iii. 계약 추가

이제 다음 단계는 계약을 추가하는 것입니다. 이를 위해 IJobs 인터페이스에서 메소드를 지정하고 [OperationContract]속성으로 데코레이션합니다.

씨#
 
[ServiceContract]
public interface IJobs
{
    [OperationContract]
    DataSet GetJobs();

    [OperationContract]
    Job GetJobInfo(int Jobid);
}

여기에서 두 메서드는 거의 동일한 작업을 수행하지만 GetJobs()메서드가 Jobs 테이블의 모든 레코드를 가져오는 반면 GetJobInfo()주어진 Jobid와 일치하는 레코드만 가져오는 약간의 차이가 있습니다.

GetJobs()내장 복합 유형인 DataSet을 반환하는 반면 GetJobInfoJob 클래스에서 이미 정의한 Job 유형을 반환합니다.

iv. 인터페이스 구현

IJobsJobs 클래스에서 인터페이스를 구현합니다 . 이를 위해 Jobs 클래스로 이동하고 마우스 오른쪽 버튼을 클릭하고 IJobs인터페이스 구현 옵션을 선택하여 Jobs 클래스에서 자동으로 IJobs 인터페이스를 구현합니다. 이 작업이 완료되면 코드를 작성해야 하는 빈 메서드를 얻게 됩니다. 메서드에 대한 코드는 다음과 같이 작성됩니다.

씨#
축소 ▲   
public class Jobs : IJobs
{
   #region IJobs Members
 
   public System.Data.DataSet GetJobs()
   {
       SqlConnection cn = new SqlConnection("data source=mytoy; user
                                             id=sa; database=pubs");
       DataSet ds = new DataSet();
       SqlDataAdapter da = new SqlDataAdapter("Select * from jobs", cn);
       da.Fill(ds, "jobs");
       return ds;
   }
 
   public Job GetJobInfo(int Jobid)
   {
       SqlConnection cn = new SqlConnection("data source=mytoy; user id=sa;
                                             database=pubs");
       cn.Open();
       string sqlstat = "select * from jobs where job_id=" + Jobid;
       SqlCommand cmd = new SqlCommand(sqlstat, cn);
       SqlDataReader dr=cmd.ExecuteReader();
       Job jobObj=new Job();
       if(dr.Read())
       {
           jobObj.Description=dr["job_desc"].ToString();
           jobObj.MinLevel=Convert.ToInt32(dr["min_lvl"].ToString();
             jobObj.MaxLevel=Convert.ToInt32(dr["max_lvl"].ToString();
       }
       else
             jobObj.Description="-1";
       return jobObj;
    }
 
    #endregion
}

데이터베이스에서 필요한 데이터를 검색하는 작업을 수행하는 이 코드에서는 논의할 내용이 많지 않습니다. 명확성을 위해 모든 연결 문자열과 명령문은 여기에 하드 코딩되어 있지만 표준 방식으로 수행할 수 있습니다. 여기서 주목해야 할 주요 사항은 이 두 가지 방법이 데이터베이스에서 데이터를 가져와 복합 유형으로 반환한다는 것입니다.

이것으로 우리의 서비스가 준비되었습니다. 어셈블리에 압축하려면 프로젝트를 빌드해야 합니다. 성공적으로 빌드한 후에는 WCFJobsLibrary.dll 인 프로젝트 디렉터리의 bin 폴더에 dll을 가져옵니다 .

WCF 서비스 테스트

라이브러리가 빌드된 후 어셈블리를 실행하십시오. 이것은 테스트 환경에서 우리의 서비스를 호스팅할 것입니다. 서비스가 호스팅되었음을 나타내는 새 아이콘이 작업 표시줄에 나타납니다.

또한 서비스가 성공적으로 추가되었다는 상태 정보를 제공하는 테스트 클라이언트 창이 열립니다.

서비스 클라이언트에는 사용되는 주소 및 바인딩 정보가 있습니다. 소비에 사용할 수 있는 방법에 대한 정보도 있습니다. 테스트 환경에서는 일부 복합 유형이 테스트 클라이언트에서 지원되지 않기 때문에 일부 메소드가 지원되지 않을 수 있습니다. 지원되지 않는 메서드의 경우 에 대한 위의 스크린샷에 표시된 것처럼 해당 메서드 이름 옆에 느낌표가 나타납니다 GetJobs().

그럼에도 불구하고 다른 방법을 테스트할 수 있습니다 GetJobInfo(). 테스트 클라이언트 창에서 해당 서비스 방법을 클릭하면 창 오른쪽에 서비스 정보가 표시됩니다. 이 정보는 요청 및 응답 부분으로 나뉩니다. 파라미터 이름 요청에 해당 값과 유형이 나열됩니다. 마찬가지로 응답에서 반환 유형의 정보가 제공됩니다. Request에 매개변수 값을 입력하고 invoke 버튼을 누르면 아래 스크린샷과 같이 Response에 결과가 표시됩니다.

그러나 테스트 클라이언트 창이 닫히면 서비스도 호스트 환경에서 제거됩니다. 서비스를 이 테스트 클라이언트와 독립적으로 만들려면 프로젝트에서 테스트 클라이언트를 분리해야 합니다. 이렇게 하려면 WCFJobsLibrary속성으로 이동하여 디버그 탭으로 이동합니다. 여기에서 명령줄 인수 상자에서 테스트 클라이언트 이름을 찾을 수 있습니다. 해당 상자에서 클라이언트 이름을 제거하면 서비스에서 클라이언트가 분리됩니다.

WCF 서비스 사용

서비스를 성공적으로 테스트했으므로 다음 단계는 서비스를 사용하는 것입니다. 이를 위해 클라이언트로 Windows 앱을 만듭니다.

나. 양식 디자인

새로 만들기 > 프로젝트 > Windows Forms 앱을 생성하고 이름을 ConsumeJobs로 지정합니다.

JobId를 제공하는 텍스트 상자 , 서비스를 호출하는 버튼, 결과를 표시하는 몇 가지 추가 텍스트 상자 를 사용하여 아래와 같이 양식을 디자인합니다 . 마찬가지로 DataGridView와 다른 버튼을 사용하여 Jobs 테이블의 모든 레코드를 표시합니다.

ii. 프록시 생성

서비스와 통신하려면 클라이언트에 프록시가 있어야 합니다.

프록시를 만들려면 클라이언트에 WCF 서비스 참조가 필요합니다.

참조를 추가하려면 솔루션 탐색기로 이동하여 프로젝트(클라이언트 앱)를 마우스 오른쪽 단추로 클릭하고 서비스 참조 추가를 선택합니다. 서비스 주소를 입력해야 하는 창이 열립니다. WCF 서비스 라이브러리의 app.config 파일에 있는 기본 주소에서 이 주소를 복사할 수 있습니다. 클라이언트와 서버 간의 통신이 http를 통해 이루어지면 해당 주소를 그대로 사용할 수 있고, 그렇지 않으면 다른 채널을 통해 통신할 경우 주소 끝에 '/mex'를 추가해야 합니다.

예를 들어 기본 주소가 다음과 같은 경우:

http://localhost:8731/Design_Time_Addresses/WCFJobsLibrary/Jobs/

그런 다음 http 이외의 모든 채널에 대해 다음과 같이 끝에 '/mex'를 추가해야 합니다.

http://localhost:8731/Design_Time_Addresses/WCFJobsLibrary/Jobs/mex

주소를 제공하고 이동 버튼을 클릭하면 해당 주소에서 사용 가능한 서비스가 검색되고 해당 서비스의 인터페이스 목록도 표시됩니다. 이 단계는 서비스가 실행 중인 경우에만 성공한다는 점을 기억해야 합니다.

서비스를 선택하고 네임스페이스에 의미 있는 이름을 제공합니다(또는 기본 이름을 사용할 수도 있음). 이 경우 이름을 JobsService로 제공합니다. 확인 버튼을 클릭하면 서비스의 원래 클래스와 이름이 비슷하지만 접미사가 '클라이언트'인 프록시가 클라이언트에 생성됩니다. WCF 서비스 라이브러리에서 클래스 이름은 Jobs이고 클라이언트 측에서 프록시 이름은 JobsClient입니다.

iii. 서비스를 사용하기 위한 코드 작성

프록시 클래스가 생성되면 클라이언트 Windows 양식의 버튼 클릭 이벤트에 코드를 작성할 수 있습니다.

씨#
 
private void btnViewDetails_Click(object sender, EventArgs e)
{
    //an instance of the proxy class
    JobsService.JobsClient obj = new ConsumeJobs.JobsService.JobsClient();
 
    //Reading the result into complex type object (Job type)
    JobsService.Job jobObj = obj.GetJobInfo(int.Parse(txtJobId.Text));
 
    //Displaying result in text boxes
    txtDescription.Text = jobObj.Description;
    txtMinValue.Text = jobObj.MinLevel.ToString();
    txtMaxValue.Text = jobObj.MaxLevel.ToString();
           
 }
 
 private void btnShow_Click(object sender, EventArgs e)
 {
    JobsService.JobsClient obj = new ConsumeJobs.JobsService.JobsClient();
    DataSet ds = obj.GetJobs();
    dataGridView1.DataSource = ds.Tables[0];
 }

우리는 서비스 프로그램에 의해 검색되고 클라이언트의 프록시 클래스에 의해 차례로 액세스되는 데이터베이스에서 결과를 얻습니다.

지금까지 Visual Studio에서 제공하는 호스팅 환경에서 서비스를 호스팅할 때 서비스를 사용하는 방법에 대해 알아보았습니다. 이제 Windows 서비스로 실행되도록 이 서비스를 Windows에 등록하는 방법을 살펴보겠습니다.

서비스 DLL을 호스팅하기 위한 Windows 서비스 만들기

이를 위해 먼저 Windows 서비스를 만들어야 합니다. 이 작업은 Windows 프로젝트 형식에서 찾을 수 있는 Windows 서비스 템플릿을 사용하여 Visual Studio에서 수행할 수 있습니다.

새로 만들기 > 프로젝트 > Windows 서비스 > 이름을 ABCService로 지정합니다.

이 서비스에 WCF DLL의 참조를 추가해야 합니다. 이렇게 하려면 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택합니다. 참조에 dll을 추가하려면 나타나는 창에서 찾아보기 탭을 선택하고 WCF 서비스 라이브러리가 있는 폴더로 이동합니다. 해당 위치에서 bin-> 디버그 폴더 내에서 dll을 찾을 수 있습니다. 이 dll이 추가되면 Windows 서비스 앱으로 가져옵니다.

마찬가지로 System.ServiceModelWindows 서비스에서 기본적으로 사용할 수 없기 때문에 네임스페이스에 대한 참조가 필요합니다. 서비스 클래스의 코드 창으로 이동하려면 기본적으로 생성되는 서비스의 디자인 보기로 이동하여 '여기를 클릭하여 코드 보기로 전환' 링크를 클릭합니다. 이 링크는 코드 보기로 이동합니다. System.ServiceModelWCF 서비스를 호스팅하는 데 필요하므로 여기에서 네임스페이스를 가져옵니다 . 기본 서비스 클래스 Service1.cs 는 OnStart 및 OnStop이라는 두 가지 이벤트를 제공합니다. 이 두 이벤트에서 각각 서비스가 시작되고 중지될 때 원하는 대로 코드를 작성할 수 있습니다.

이 클래스의 코드는 아래와 같이 작성됩니다.

씨#
 
namespace ABCService
{
    public partial class Service1 : ServiceBase
    {
        ServiceHost sHost;
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            sHost = new ServiceHost(typeof(WCFJobsLibrary.Jobs));
            sHost.Open();
        }
 
        protected override void OnStop()
        {
            sHost.Close();
        }
    }
}

OnStart 이벤트에서 WCF 라이브러리에 대한 서비스 호스트를 만들고 여는 중입니다. Windows 서비스가 종료되면 OnStop 이벤트에 지정된 서비스 호스트를 종료해야 합니다.

구성도 필요하므로 이 코드를 작성하는 것만으로는 충분하지 않습니다. 필요에 따라 서비스를 호스팅하고 제대로 실행하려면 구성을 수행해야 합니다. 이러한 구성은 Windows 서비스 앱의 App.Config 파일에 지정됩니다. 이 파일은 기본적으로 사용할 수 없으므로 새 항목으로 추가하고 애플리케이션 구성 파일 템플릿을 선택하여 만들어야 합니다.

생성된 App.Config 파일에 빈 구성이 있습니다. 즉, <configuration> 태그 아래에 지정된 구성이 없습니다. 이러한 모든 구성을 지루하게 작성하는 대신 서비스 라이브러리의 App.Config에서 복사하기만 하면 됩니다. <system.serviceModel>에서 사용 가능한 모든 항목을 복사 하여 Windows 서비스의 App.Config 에 붙여넣습니다 .

이제 서비스를 빌드합니다. 이렇게 하면 WCF 서비스를 Windows 서비스로 호스팅하는 단계가 완료됩니다. 이제 남은 것은 Windows OS에 등록하는 것입니다.

Windows OS에 서비스 등록

  1. Windows 서비스의 디자인 보기로 이동하여 마우스 오른쪽 버튼을 클릭하고 설치 프로그램 추가 옵션을 클릭합니다.
  2. 이것을 클릭하면 두 개의 프로세스가 표시 ServiceProcessInstaller됩니다 ServiceInstaller.을 클릭 ServiceProcessInstaller하고 해당 계정 속성을 로컬 시스템으로 설정합니다.
  3. 이제 을 클릭 ServiceInstaller하고 표시 이름을 제공합니다 ABCNITJobsService. 또한 시작 유형(수동, 자동 또는 비활성화됨)을 선택합니다. 우리의 경우 수동 또는 자동을 선택할 수 있습니다.
  4. 이제 서비스를 다시 빌드하십시오. 이렇게 하면 프로젝트 디렉터리에 있는 ABCService(이 경우)라는 실행 파일이 생성됩니다.이 exe 파일을 서비스로 실행하려면 Windows OS에 등록해야 합니다.
  5. 이 exe 파일 위치의 경로를 복사하고 명령 프롬프트에서 포함하는 폴더를 엽니다.해당 경로에서 Windows OS에 서비스를 등록하는 InstallUtil ABCService.exe 명령을 작성합니다.(제어판 > 관리 도구 > 서비스)
  6. 자동으로 시작되지 않으면 시작 링크를 클릭하여 수동으로 시작할 수 있습니다.
  7. Windows에 등록되면 서비스 목록에서 볼 수 있습니다.
  8. 서비스가 시작되면 명령 프롬프트에서 netstat -a 명령을 사용하여 수신 여부를 확인할 수 있습니다.

서비스가 Windows 서비스로 실행되므로 WCF 서비스 라이브러리를 실행할 필요가 없습니다. 닫을 수 있고 Windows 환경에서 서비스를 사용할 수 있습니다.

참고: Vista OS를 사용하는 경우 서비스 호스팅을 위해 관리자 모드로 실행해야 합니다.

특허

이 문서는 관련 소스 코드 및 파일과 함께 The Code Project Open License(CPOL) 에 따라 사용이 허가되었습니다.

 

작성자
소프트웨어 개발자(선임) Naresh Information Technologies
 인도
Myself Today는 MNC의 수석 DotNet 컨설턴트이자 인도 AP 인도 하이데라바드의 RIT GLOBAL Technologies와 협력하는 기업 트레이너입니다. Dbase III+, Foxpro, COBOL, C, ORACLE로 시작하여 현재 최고의 Microsoft Technologies ASP.NET, C#.NET 및 VB.NET, SQL SERVER에 정통합니다. 최신 개발 AJAX, SilverLight, WCF, WPF, LIVE 등 항상 새롭고 원하는 기술을 구현하는 데 관심이 있습니다. 일부 프로젝트를 위한 자체 개발 팀이 있습니다. 내 게시물에 대한 의견을 듣고 싶습니다.

출처 - https://www.codeproject.com/Articles/38160/WCF-Service-Library-with-Windows-Service-Hosting

728x90

'VisualStudio > WCF' 카테고리의 다른 글

[WCF] AppConfig 설명  (0) 2023.01.03
[WCF] WCF - 프록시 사용이유  (0) 2023.01.03
[WCF] API 사용 방법  (0) 2022.08.25