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#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.