WCF: Служба Windows на C#

Служба Windows на C#

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье мы напишем простую WCF-службу Windows на C#, и установим её. Её можно будет запускать, останавливать, как и все другие службы Windows.

Клиентская часть будет та же, что и в прошлых двух статьях — это Windows Forms — приложение, которое шлёт сообщения по адресу http://localhost:343/IContract.

Создадим проект WindowsService, который является консольным приложением. Не забываем добавлять в проект необходимые ссылки. Сразу приведу код:

Файл Service.cs:

// не забываем добавлять данные ссылки в проект
using System.ServiceProcess;
using System.ServiceModel;
using System.ComponentModel;
using System.Configuration.Install;

namespace WindowsService
{
  // это служебный класс для служб Windows
  [RunInstaller(true)]
  public class ProjectInstaller : Installer
  {
    private ServiceProcessInstaller serviceProcess;
    private ServiceInstaller serviceInstaller;

    public ProjectInstaller()
    {
      serviceProcess = new ServiceProcessInstaller();
      // учетная запись, под которой будет запускаться служба
      serviceProcess.Account = ServiceAccount.LocalSystem;

      serviceInstaller = new ServiceInstaller();
      serviceInstaller.ServiceName = "Приём сообщений";
      serviceInstaller.Description = @"Служба, которая ожидает приёма сообщений по адресу http://localhost:343/IContract";
      // указываем, чтобы служба запускалась автоматически при запуске рабочей станции
      serviceInstaller.StartType = ServiceStartMode.Automatic;

      Installers.Add(serviceProcess);
      Installers.Add(serviceInstaller);
    }
  }

  // Наш контракт
  [ServiceContract]
  interface IContract                                                  
  {
    [OperationContract]
    string Print(string str);
  }


  // Наш сервис, который реализует контракт
  class Service : IContract
  {
    public string Print(string str)
    {
      return "Сообщение клиента: " + str;
    }
  }

  // Наша служба Windows
  public partial class WindowsService : ServiceBase
  {
    ServiceHost serviceHost = null;

    // Запуск службы
    protected override void OnStart(string[] args)
    {
      if (serviceHost == null)
      {
        serviceHost = new ServiceHost(typeof(Service));
        serviceHost.Open();
      }
    }
    // Остановка службы
    protected override void OnStop()
    {
      if (serviceHost != null)
      {
        serviceHost.Close();
      }
    }
  }
}

Не забываем добавить файл App.config:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
  <system.serviceModel>
    <services>
      <service name ="WindowsService.Service">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:343/IContract"/>
          </baseAddresses>
        </host>
        <!-- указываем адрес, привязку и контракт -->
        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="WindowsService.IContract" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Класс Program.cs:

using System.ServiceProcess;

namespace WindowsService
{
  class Program
  {
    // В данном методе запускается наша служба
    static void Main(string[] args)
    {
      ServiceBase[] ServicesToRun;
      ServicesToRun = new ServiceBase[]
      {
        new WindowsService()
      };
      ServiceBase.Run(ServicesToRun);
    }
  }
}

При попытке запустить нашу службу из Visual Studio мы увидим следующую ошибку:

Служба Windows на C#

Давайте установим нашу службу правильно с помощью утилиты installutil.exe. Создадим на диске "C" папку "WindowsService". В эту папку поместим файлы "WindowsService.exe" и "WindowsService.exe.config", который создаётся в момент компиляции программы. Создадим 2 текстовых файла, которые будут устанавливать и удалять нашу службу. У этих двух файлов изменим расширение с "txt" на "bat".

Содержимое файла InstallService.bat:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsService.exe

Содержимое файла UninstallService.bat:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u WindowsService.exe

Установим нашу службу. Видим, что служба была установлена:

Служба Windows на C#

В панели управления на вкладке "Администрирование — Службы" мы видим, что служба появилась. Запустим её:

Служба Windows на C#

После того, как у нас служба запустилась, запустим клиентскую часть и убедимся, что всё работает (сообщения отправляются):

Служба Windows на C#

В предыдущих статьях наш сервис являлся простым приложением. Для сервиса такой вариант не совсем удобен. Первое, что приходит в голову, — это вариант, когда сервис располагается на сервере. Если у нас сервис не является службой Windows, то при перезагрузке сервера администратору необходимо будет зайти и вручную запустить программу. Чтобы этого не делать, сервис необходимо делать службой, устанавливая автоматический тип запуска.

В данной статье вы создали простую WCF-службу Windows на C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *