Wcf запуск в виде службы windows

Обновлено: 05.07.2024

в этом руководстве описывается третья из пяти задач, необходимых для создания приложения basic Windows Communication Foundation (WCF). общие сведения о учебниках см. в разделе учебник. начало работы с Windows Communication Foundation приложениями.

Следующей задачей для создания приложения WCF является размещение службы WCF в консольном приложении. Служба WCF предоставляет одну или несколько конечных точек, каждая из которых предоставляет одну или несколько операций службы. Конечная точка службы задает следующие сведения:

  • Адрес, по которому можно найти службу.
  • Привязка, которая содержит сведения, описывающие, как клиент должен взаимодействовать со службой.
  • Контракт, определяющий функциональные возможности, предоставляемые службой своим клиентам.

В этом руководстве описано следующее:

  • Создание и Настройка проекта консольного приложения для размещения службы WCF.
  • Добавьте код для размещения службы WCF.
  • Обновите файл конфигурации.
  • Запустите службу WCF и убедитесь, что она запущена.

Создание и Настройка проекта консольного приложения для размещения службы

Создайте проект консольного приложения в Visual Studio:

в меню файл выберите открыть > Project/солутион и перейдите к созданному ранее решению GettingStarted (GettingStarted. sln). Щелкните Open(Открыть).

В меню вид выберите Обозреватель решений.

в окне обозреватель решений выберите решение GettingStarted (верхний узел), а затем в контекстном меню выберите добавить > новый Project .

Добавьте ссылку в проект GettingStartedHost в проект жеттингстартедлиб :

В окне Обозреватель решений выберите папку References в проекте GettingStartedHost , а затем в контекстном меню выберите пункт Добавить ссылку .

В диалоговом окне Добавление ссылки в разделе проекты в левой части окна выберите решение.

Выберите жеттингстартедлиб в центральном разделе окна, а затем нажмите кнопку ОК.

Это действие делает типы, определенные в проекте жеттингстартедлиб , доступными для проекта GettingStartedHost .

Добавьте ссылку в проект GettingStartedHost в System.ServiceModel сборку:

В окне Обозреватель решений выберите папку References в проекте GettingStartedHost , а затем в контекстном меню выберите пункт Добавить ссылку .

В окне Добавление ссылки в разделе сборки в левой части окна выберите платформа.

Выберите System. ServiceModel и нажмите кнопку ОК.

Сохраните решение, выбрав файл > сохранить все.

Добавление кода для размещения службы

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

Внесите следующие изменения в код:

Откройте файл Program. CS или Module1. vb в проекте GettingStartedHost и замените его код следующим кодом:

Сведения о том, как работает этот код, см. в статье этапы программы размещения службы.

Обновите свойства проекта:

В окне Обозреватель решений выберите папку GettingStartedHost , а затем в контекстном меню выберите пункт Свойства .

На странице свойства GettingStartedHost выберите вкладку приложение :

для Visual Basic проектов выберите Service. Program из списка автоматически запускаемых объектов .

В меню файл выберите сохранить все.

Проверка работоспособности службы

Выполните сборку решения, а затем запустите консольное приложение GettingStartedHost в Visual Studio.

Служба должна запускаться с правами администратора. поскольку вы открыли Visual Studio с правами администратора, при запуске GettingStartedHost в Visual Studio приложение также запускается с правами администратора. В качестве альтернативы можно открыть новую командную строку от имени администратора (в контекстном меню выберите больше > запуска от имени администратора ) и выполнить в ней GettingStartedHost.exe .

Шаги программы размещения службы

Шаги в коде, добавленном для размещения службы, описаны ниже.

Шаг 2. Создайте экземпляр ServiceHost класса, который используется для размещения службы. Конструктор принимает два параметра: тип класса, который реализует контракт службы, и базовый адрес службы.

при добавлении библиотеки службы WCF Visual Studio размещает ее для вас при отладке, запуская узел службы. чтобы избежать конфликтов, можно запретить Visual Studio размещения библиотеки службы WCF.

  1. Выберите проект жеттингстартедлиб в Обозреватель решений и в контекстном меню выберите пункт Свойства .
  2. Выберите параметры WCF и снимите флажок запустить узел службы WCF при отладке другого проекта в том же решении.

Дальнейшие действия

В этом руководстве вы узнали, как выполнять следующие задачи:

  • Создание и Настройка проекта консольного приложения для размещения службы WCF.
  • Добавьте код для размещения службы WCF.
  • Обновите файл конфигурации.
  • Запустите службу WCF и убедитесь, что она запущена.

Перейдите к следующему руководству, чтобы научиться создавать клиент WCF.

Windows Communication Foundation – программная платформа от Microsoft для создания, настройки и развертывания распределенных сетевых сервисов. WCF-runtime и его пространство имен System.ServiceModel, представляющее его главный программный интерфейс, это преемник технологий создания распределенных систем, успешно применяемых разработчиками для создания распределенных приложений на платформе Windows в последнее десятилетие. Разберём тестовый пример создания WCF-сервиса.

Открываем Visual Studio 2015 и создаём новый проект типа Class Library. Проект назовём WCFMyServiceLibrary.



Файл Class1.cs переименуем в MyService.cs и добавим ещё один класс, файл для которого назовём IMyService.cs.

Добавим ссылку на сборку System.ServiceModel.

В файле MyService.cs опишем реализацию интерфейса:

На этом разработка сервиса завершена. Переходим к созданию службы Windows, которая будет контейнером для данного сервиса.

В том же решении (Solution) создадим новый проект типа «Служба Windows». Называем проект WindowsServiceHostForMyService.


Затем файл Service1.cs (только что созданного проекта) переименуем в MyService.cs. В этот проект добавим ссылку на сборку System.ServiceModel, а также не забываем указывать в файле MyService.cs директивы:


В классе MyService добавляем новый член:


Также необходимо добавить ссылку на проект WCFMyServiceLibrary, который находится в этом же решении:


Затем в классе MyService изменим метод OnStart таким образом, чтобы в этом методе добавлялись конечные точки нашего сервиса (endpoint):

Затем реализуем остановку сервиса в методе OnStop:


Затем в Обозревателе решения — двойной клик на файле MyService.cs (проекта WindowsServiceHostForMyService) откроет этот файл в режиме конструктора (Design Mode).


На пустом пространстве вызываем контекстное меню (щелчок правой кнопкой мыши) и выбираем «Добавить установщик».


При этом будет создан новый класс ProjectInstaller.cs
Переименуем файл ProjectInstaller.cs в MyServiceInstaller.cs.
При этом выйдет окно с вопросом, следует ли переименовать зависимые объекты – отвечаем «Да».

Добавим в файл ссылку


Затем изменим код конструктора класса MyServiceInstaller:


Заметим, что вызов метода InitializeComponent() мы заблокировали с помощью комментария.
На этом разработка службы Windows завершена. Собираем всё решение (Build Solution) и переходим к следующему этапу – установка службы Windows.

Для установки нашей службы создадим bat-файл (с произвольным названием, например Install_Windows_Service.bat) следующего содержания:


Нужно скопировать этот bat-файл в ту же папку, где находится скомпилированный файл WindowsServiceHostForMyService.exe (вам нужно заранее продумать, в какой папке будет лежать этот файл, который будет всегда запущен в качестве службы Windows).

Запускаем bat-файл, после чего наша программа WindowsServiceHostForMyService.exe будет установлена в качестве службы Windows.

Запустим эту службу с помощью стандартной программы управления службами.

Следующий этап – разработка клиентского приложения для использования предоставляемых сервисом услуг.

Для этого прежде всего нужно организовать так называемый «переходник» — Service Proxy – набор настроек, описывающих сервис для клиентского приложения.

Воспользуемся для этого стандартной утилитой SvcUtil.exe. Создадим файл Generate_Proxy.bat следующего содержания


Запустим этот файл (стандартная утилита SvcUtil.exe находится в папке C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin).

Этот файл нужно запустить во время работы нашего сервиса, т.е. в данном случае, после успешного запуска службы Windows WindowsServiceHostForMyService.

В случае успешного запуска, программа SvcUtil.exe сгенерирует 2 файла — MyServiceProxy.cs и App.config.

Эти файлы необходимо добавить для клиентского приложения, чтобы это приложение могло вызывать методы нашей службы (чуть ниже вы узнаете, что файл App.config я решил не добавлять — обойдёмся и без него).

Примечание. Аналогичного результата можно было добиться, запустив

В том же решении (Solution) создадим обычное приложение Windows Forms. Назовем его WindowsFormsApplication1


Добавим в этот проект ссылку на System.ServiceModel и, конечно же,


Добавим в этот проект файл MyServiceProxy.cs (именно его мы сгенерировали утилитой SvcUtil.exe). При этом следует добавить в файл MyServiceProxy.cs следующие строки:


После этого, мы сможем ссылаться на класс MyServiceClient (этот класс создан программой SvcUtil.exe), указав в файле формы директиву.

Пример готового файла MyServiceProxy.cs (комментарии удалены):

Поступим неординарно – и не будем добавлять файл App.Config в проект клиента!

Кнопка btn_Start – создаёт клиента
Кнопка btn_Send – отправляет сервису текстовую строку из текстового поля
Кнопка btn_Close – удаляет клиента из памяти и закрывает приложение


Заметим, что в данном примере на клиенте мы совсем не использовали конечную точку

четверг, 4 июля 2013 г.

Размещение WCF библиотеки в службе Windows.

В этой статье хочу рассказать как правильно разместить службу WCF (Windows Communication Foundation) в службе Windows 7.

Создадим новый проект WCF Service Library.


В Solution Explorer находим файл app.config, нажимаем на нем правой кнопкой и выбираем Edit WCF Configuration.


Переходим к пункту Host. Выбираем базовый адрес и нажимаем кнопку "Edit"




На пункте Binding нажимаем правую кнопку и выбираем New Binding Configuration




Переходим к пункту Service Endpoint и меняет Binding на netTcpBinding



Переходим ко второму пункту (Empty Name) и в Binding указываем mexTcpBinding


На этом настройка конфигурации закончена. Нажимаем File - Save.



На дизайнере службы нажимаем правую кнопку и добавляем установщик (Add Installer).



Выбираем появившийся serviceProcessInstaller1 и меняет Account с User на LocalSystem



Добавляем в проект WindowsService1 ссылку на проект WcfLibraryService (Add reference)
Выбираем serviceInstaller1, переключаемся на вкладку событий, и дважды щелкаем по событию AfterInstall.


Переходим к коду, добавляем using System.Management;
В процедуру serviceInstaller1_AfterInstall вписываем следующий код:

  1. private void serviceInstaller1_AfterInstall( object sender, InstallEventArgs e)
  2. ConnectionOptions coOptions = new ConnectionOptions ();
  3. coOptions.Impersonation = ImpersonationLevel .Impersonate;
  4. ManagementScope mgmtScope = new System.Management. ManagementScope ( @"root\CIMV2" , coOptions);
  5. mgmtScope.Connect();
  6. using ( ManagementObject wmiService = new ManagementObject ( "Win32_Service.Name='" + serviceInstaller1.ServiceName + "'" ))
  7. ManagementBaseObject InParam = wmiService.GetMethodParameters( "Change" );
  8. InParam[ "DesktopInteract" ] = true ;
  9. wmiService.InvokeMethod( "Change" , InParam, null );
  10. >
  11. >

Это действие позволит службе взаимодействовать с рабочим столом пользователя.
Хотя в Windows 7 это уже не актуально. И только добавляем больше проблем.

Весь код файла выглядит так:

  1. using System.ComponentModel;
  2. using System.Configuration.Install;
  3. using System.Management;
  4. namespace WindowsService1
  5. [ RunInstaller ( true )]
  6. public partial class ProjectInstaller : System.Configuration.Install. Installer
  7. public ProjectInstaller()
  8. InitializeComponent();
  9. >
  10. private void serviceInstaller1_AfterInstall( object sender, InstallEventArgs e)
  11. ConnectionOptions coOptions = new ConnectionOptions ();
  12. coOptions.Impersonation = ImpersonationLevel .Impersonate;
  13. ManagementScope mgmtScope = new System.Management. ManagementScope ( @"root\CIMV2" , coOptions);
  14. mgmtScope.Connect();
  15. using ( ManagementObject wmiService = new ManagementObject ( "Win32_Service.Name='" + serviceInstaller1.ServiceName + "'" ))
  16. ManagementBaseObject InParam = wmiService.GetMethodParameters( "Change" );
  17. InParam[ "DesktopInteract" ] = true ;
  18. wmiService.InvokeMethod( "Change" , InParam, null );
  19. >
  20. >
  21. >
  22. >

В свойствах проекта WcfServiceLibrary на последней вкладке снимаем галочку Start WCF Service Host.



Копируем файл app.config в проекте WcfServiceLibrary



Идея такая, что файл app.config должен быть одинаковый в этих двух проектах.
Потому что служба WCF будет вызываться из службы Windows, то в проекте службы Windows должны находиться параметры WCF службы. Эти параметры служба Windows (WindowsService1) не может достать из файла app.config проекта WcfServiceLibrary.

В проекте WindowsService1 на файле Service1 нажимаем правой кнопкой и выбираем View Code


Добавляем ссылку на сборку System.ServiceModel;
И в коде вписываем using System.ServiceModel;

В процедуре OnStart вписываем код:

  1. protected override void OnStart( string [] args)
  2. if (myServiceHost != null )
  3. if (myServiceHost.State == CommunicationState .Opened) myServiceHost.Close();
  4. >
  5. try
  6. myServiceHost = new ServiceHost ( typeof (WcfServiceLibrary1. Service1 ));
  7. myServiceHost.Open();
  8. >
  9. catch ( Exception ex)
  10. EventLog .WriteEntry( this .ServiceName, ex.Message);
  11. >
  12. >

Это позволит службе Windows при запуске запустить хостинг WCF службы
В процедуре OnStop вписываем код:

  1. protected override void OnStop()
  2. if (myServiceHost != null )
  3. myServiceHost.Close();
  4. myServiceHost = null ;
  5. >
  6. >

В итоге общий код файла выглядит так:

  1. using System;
  2. using System.Diagnostics;
  3. using System.ServiceProcess;
  4. using System.ServiceModel;
  5. namespace WindowsService1
  6. public partial class Service1 : ServiceBase
  7. public Service1()
  8. InitializeComponent();
  9. >
  10. private static ServiceHost myServiceHost = null ;
  11. protected override void OnStart( string [] args)
  12. if (myServiceHost != null )
  13. if (myServiceHost.State == CommunicationState .Opened) myServiceHost.Close();
  14. >
  15. try
  16. myServiceHost = new ServiceHost ( typeof (WcfServiceLibrary1. Service1 ));
  17. myServiceHost.Open();
  18. >
  19. catch ( Exception ex)
  20. EventLog .WriteEntry( this .ServiceName, ex.Message);
  21. >
  22. >
  23. protected override void OnStop()
  24. if (myServiceHost != null )
  25. myServiceHost.Close();
  26. myServiceHost = null ;
  27. >
  28. >
  29. >
  30. >

Добавляем новый проект Windows Forms. И делаем его запускаемым по-умолчанию (Set as Startup project).
Кидаем на форму кнопку и добавляем ссылку на службу (Add Service Reference)
Нажимаем кнопку Discover и выбираем службу Service1


  1. private void button1_Click( object sender, EventArgs e)
  2. ServiceReference1. Service1Client myService = new ServiceReference1. Service1Client ();
  3. MessageBox .Show(myService.GetData(123), "My Service" );
  4. myService.Close();
  5. >

Весь файл должен выглядеть так:

  1. using System;
  2. using System.Windows.Forms;
  3. namespace WindowsFormsApplication1
  4. public partial class Form1 : Form
  5. public Form1()
  6. InitializeComponent();
  7. >
  8. private void button1_Click( object sender, EventArgs e)
  9. ServiceReference1. Service1Client myService = new ServiceReference1. Service1Client ();
  10. MessageBox .Show(myService.GetData(123), "My Service" );
  11. myService.Close();
  12. >
  13. >
  14. >

Нажимаем F6 - для компиляции проекта. Ошибок быть не должно.
Открываем папку проекта WindowsService1


В эту папку нужно скопировать файл InstallUtil.exe
Чтобы его найти на вашем компьютере воспользуйтесь поиском.

Создадим файл InstallServiceAndStart.bat со следующим текстом:
InstallUtil.exe WindowsService1.exe
net start Service1

Создадим файл UninstallServiceAndStop.bat со следующим текстом:
net stop Service1
InstallUtil.exe /u WindowsService1.exe

В итоге папка должна выглядеть так:


Если вы используете Windows XP то для запуска/удаления службы можно пользоваться этими BAT файлами. Если же Windows 7 - то нужно сделать так:
В меню найдите пункт Microsoft Visual Studio 2010\Visual Studio tools

В этой папке есть "Open Visual Studio Command Prompt (2010)", нажмите на нем правой кнопкой мыши и выберите "Запуск от имени Администратора". Отобразится та же консоль.
Поменяйте текущую папку.

Данная статья открывает курс уроков по технологии WCF и рассчитана в первую очередь на новичков в программировании веб-сервисов.

Оглавление

1. Содержание урока

2. Создание проекта сервиса

В работе используется Visual Studio 2013 Professional, версия фреймворка 4.5.1. Для заметки: за некоторыми небольшими исключениями, разницы между версиями 4.0. и 4.5.1 нет, но использование последней предпочтительней, т.к. добавляет полезную функцию генерации WSDL одним файлом, но об этом ниже.


Итак, запускаем студию и создаем проект типа WCF Service Application в соответствующем разделе, называем его SampleService.


После создания проекта рассмотрим структуру решения в обозревателе решений:

Для начала переименуем сервис и его интерфейс, придав им имена Calculator и ICalculator соответственно, а также изменим строчку в разметке сервиса (файл Calculator.svc):


Теперь опишем сам интерфейс нашего калькулятора. Объявим стандартные арифметические операции, такие как сложение (Addition), вычитание (Subtraction), умножение (Multiplication) и деление (Division). Также добавим дополнительный метод TestConnection, возвращающий строку. С помощью этого метода клиенты смогут проверить, что сервис функционирует, т.к. стандартного «пинга» WCF не предоставляет. Все методы интерфейса должны быть помечены атрибутом [OperationContract], иначе они не будут видны клиентам.

В итоге, интерфейс примет следующий вид:

Теперь реализуем интерфейс в классе сервиса:

Логика сервиса описана, теперь необходимо его разместить на хостинге.

3. Размещение сервиса

Сам по себе сервис представляет библиотеку (в нашем случае файл SampleService.dll), и для ее запуска в виде сервиса необходимо воспользоваться одним из предоставляемых WCF методов:

  • 1. Хостинг на IIS.
  • 2. Запуск в виде службы Windows.
  • 3. Self hosting (сервис выполнен в виде консольного приложения, запускающего сервис).

Раздел Start Action определяет, что произойдет при запуске проекта в студии:

Под спойлером указан один из вариантов набора компонентов для работы сервисов.



После создания пула, назначьте его вашему приложению (Default Web Site > Lesson1 > Дополнительные параметры > Пул приложений).


Теперь немного о WSDL. По сути это XML, содержащая описание сервиса, его методов и точек подключения. Чтобы сторонние интеграторы смогли подключиться к вашему сервису, им нужна ссылка на WSDL. WSDL может быть разбита на части (по умолчанию) или быть одним файлом (см. выше). Важно помнить, что не все клиенты (например, SoapClient на PHP) могут работать с WSDL, разбитой на части, поэтому наличие однофайловой WSDL приветствуется.

4. Публикация сервиса

Под публикацией сервиса подразумевается его компиляция для дальнейшего выкладывания сборки на сервер. Рассмотрим на конкретном примере, выложив сервер на демонстрационный сервер компании.


Для начала, необходимо создать профиль публикации, для этого кликнем правой кнопкой мыши на имени проекта и выберем пункт Publish.


Мастер предложит нам несколько вариантов публикации, выберем Custom, профиль назовем Demo.
Затем выберем метод публикации File System и укажем путь, куда будет сохраняться наша сборка:


Проект готов к публикации, но желательно еще перейти к следующей вкладке (Settings) и отметить галочку «Delete all existing files prior to publish» (удалять все файлы перед публикацией) и выбрать конфигурацию.


Выполняем публикацию и смотрим, что получилось в итоге:


Чтобы разместить сервис на вашем сайте, скопируйте папку на сервер и подключите к IIS как приложение, как если бы это был обычный сайт (Default Web Site > Add Application. )

5. Вызов сервиса


Создадим в нашем решении еще один проект типа Console Application и назовем его TestClient. Назначим его исполняемым и добавим ссылку на сервис:


В открывшемся окне введем адрес локальный сервиса, по желанию укажем имя пространства имен и дополнительные настройки. Здесь же можно посмотреть, какие методы предоставляет наш сервис:

После создания ссылки на сервис, в проекте появится папка «Service References», в которой будет находиться сгенерированный сутидей клиент. Его код при желании вы можете посмотреть самостоятельно, надо только включить отображение скрытых файлов или перейти по F12 внутрь кода клиента.

Теперь напишем код для подключения к сервису и вызов арифметических операций, предоставляемых им:


Результат исполнения:

Переходим к другому способу вызова сервиса.

SoapUI


Запускаем программу и создаем новый проект. В поле адреса сервиса указываем на WSDL и вводим название проекта:


Как видим, SoapUI извлек интерфейсы сервиса и создал тестовые запросы для каждого из методов:


Осталось заполнить числовые значения и вызвать сервис:


Запрос-ответ после изменения пространства имен:

С остальными возможностями SoapUI предлагаем ознакомиться самостоятельно.

WebInvoke

Для начала, изменим конфигурацию:

Одного изменения конфигурации недостаточно, требуется также описать маппинги для методов интерфейса ICalculator. Пример для метода Addition:

Если бы, допустим, у нас был метод, принимающий строки, можно было бы указать аргументы через слеш, например так:

Но у нас числа, поэтому прописываем по аналогии атрибут WebInvoke в прочим методам, в итоге получаем следующий код:

После компиляции сервиса мы получаем возможность вызывать методы через URL, не самую приятную на вид, но все же.

Читайте также: