WCF: Служба 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 мы увидим следующую ошибку:

Давайте установим нашу службу правильно с помощью утилиты 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, то при перезагрузке сервера администратору необходимо будет зайти и вручную запустить программу. Чтобы этого не делать, сервис необходимо делать службой, устанавливая автоматический тип запуска.
В данной статье вы создали простую WCF-службу Windows на C#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




