Что такое Windows Communication Foundation
Windows Communication Foundation (WCF) — это платформа для создания приложений, ориентированных на службы. С помощью WCF можно передавать данные в виде асинхронных сообщений из одной конечной точки службы в другую. Конечная точка службы может входить в постоянно доступную службу, размещаемую в IIS, или представлять службу, размещаемую в приложении. Конечная точка может быть клиентом службы, которая запрашивает данные от конечной точки службы. Сообщения могут представлять одиночный символ или одно слово, отправляемое в формате XML, или иметь вид сложного потока двоичных данных. Далее представлено несколько образцов сценариев.
Защищенная служба для обработки бизнес-транзакций.
Служба, передающая другим объектам текущие данные, такие как отчет о трафике, или другая служба наблюдения.
Служба бесед, которая позволяет двум пользователям общаться и обмениваться данными в реальном времени.
Приложение панели мониторинга, которая опрашивает одну или несколько служб и дает логическое представление полученных данных.
Предоставление доступа к рабочему процессу, реализованному с помощью Windows Workflow Foundation, в виде службы WCF.
Приложение Silverlight для запроса последних каналов данных в службе.
Хотя создание таких приложений было возможным до появления WCF, WCF упрощает разработку конечных точек, чем когда-либо. В целом, WCF призвана обеспечить управляемый подход к созданию веб-служб и клиентов веб-служб.
Возможности WCF
В состав WCF входит следующий набор функций. Дополнительные сведения см. в разделе сведения о функции WCF.
Сервис-ориентированность
Совместимость
WCF реализует современные отраслевые стандарты для взаимодействия веб-служб. Дополнительные сведения о поддерживаемых стандартах см. в статье взаимодействие и интеграция.
Несколько шаблонов сообщений
Обмен сообщениями выполняется по одному из нескольких шаблонов. Чаще всего используется шаблон «запрос-ответ», когда одна конечная точка запрашивает данные от другой конечной точки. Вторая конечная точка отвечает. Существуют и другие шаблоны, например одностороннее сообщение, когда одна конечная точка отправляет сообщение, не ожидая ответа. Более сложным является шаблон дуплексного обмена, когда две конечные точки устанавливают соединение и отправляют данные в обоих направлениях подобно программе обмена мгновенными сообщениями. Дополнительные сведения о реализации различных шаблонов обмена сообщениями с помощью WCF см. в разделе контракты.
Метаданные службы
WCF поддерживает публикацию метаданных службы с использованием форматов, указанных в отраслевых стандартах, таких как WSDL, XML Schema и WS-Policy. Эти метаданные можно использовать для автоматического создания и настройки клиентов для доступа к службам WCF. Метаданные могут публиковаться через HTTP и HTTPS или с использованием стандарта обмена метаданными веб-служб. Дополнительные сведения см. в разделе Метаданные.
Контракты данных
Безопасность
Сообщения можно шифровать для защиты конфиденциальности и требовать от пользователей проходить проверку подлинности перед приемом сообщений. Можно реализовать широко известные стандарты безопасности, такие как SSL и WS-SecureConversation. Дополнительные сведения см. в статье Безопасность.
Несколько транспортов и кодировок
Сообщения могут отправляться по любому из нескольких встроенных транспортных протоколов в различных кодировках. Наиболее распространенный протокол и кодировка — это отправка сообщений SOAP, закодированных в виде текста, с использованием протокола HTTP для использования в Интернете. Кроме того, WCF позволяет отсылать сообщения по протоколу TCP, именованным каналам или MSMQ. Сообщения можно кодировать в виде текста или использовать оптимизированный двоичный формат. Двоичные данные можно эффективно отправлять с использованием стандарта MTOM. Если ни один из предоставляемых транспортов и кодировок не подходит к текущим требованиям, вы можете создать собственный пользовательский транспорт или кодировку. Дополнительные сведения о транспортах и кодировках, поддерживаемых WCF, см. в статье транспорты.
Надежные сообщения и сообщения в очереди
WCF поддерживает надежный обмен сообщениями, используя надежные сеансы, реализованные с помощью WS-Reliable обмена сообщениями и MSMQ. Дополнительные сведения о поддержке надежных и очередных сообщений в WCF см. в статье очереди и надежные сеансы.
Устойчивые сообщения
Устойчивые сообщения не теряются в случае перебоев связи. Сообщения, передаваемые по устойчивому шаблону, всегда сохраняются в базе данных. Если происходит перебой связи, база данных позволяет возобновить обмен сообщениями после восстановления соединения. вы также можете создать устойчивое сообщение с помощью Windows Workflow Foundation (WF). Дополнительные сведения см. в разделе службы рабочих процессов.
Транзакции
WCF также поддерживает транзакции с использованием одной из трех моделей транзакций: WS-Атомиктрансактионс, API-интерфейсы в System.Transactions пространстве имен и Microsoft координатор распределенных транзакций. Дополнительные сведения о поддержке транзакций в WCF см. в разделе транзакции.
Поддержка AJAX и REST
Расширяемость
Архитектура WCF имеет ряд точек расширения. Если требуются дополнительные возможности, поддерживаются точки входа, посредством которых можно настроить поведение службы. Дополнительные сведения о доступных точках расширения см. в разделе Расширение WCF.
Интеграция WCF с другими технологиями Майкрософт
WCF — это гибкая платформа. Из-за такой крайней гибкости WCF также используется в нескольких других продуктах Майкрософт. Зная основы WCF, вы получаете мгновенное преимущество, если вы также используете любой из этих продуктов.
первая технология, связанная с WCF, была Windows Workflow Foundationом (WF). Рабочие процессы упрощают разработку приложений, инкапсулирующие шаги в рабочем процессе как «действия». в первой версии Windows Workflow Foundation разработчику пришлось создавать узел для рабочего процесса. следующая версия Windows Workflow Foundation была интегрирована с WCF. Это позволяло легко размещать любой рабочий процесс в службе WCF. это можно сделать, автоматически выбрав тип проекта WF/WCF в Visual Studio 2012 или более поздней версии.
Microsoft BizTalk Server R2 также использует WCF в качестве коммуникационной технологии. BizTalk предназначен для получения и преобразования данных из одного стандартного формата в другой. Сообщения должны доставляться в центральный ящик, где сообщение может преобразовываться по строгому сопоставления или с использованием одной из функций BizTalk, таких как подсистема рабочих процессов. Теперь BizTalk может использовать бизнес-адаптер WCF для доставки сообщений в окно сообщения.
Платформа Microsoft Silverlight предназначена для создания многофункциональных веб-приложений широкой совместимости и дает разработчикам возможность создавать веб-узлы, интенсивно использующие мультимедиа-функции (например, потоковое видео). Начиная с версии 2, Silverlight внедряет WCF в качестве технологии связи для подключения приложений Silverlight к конечным точкам WCF.
возможности размещения сервера приложений Windows server AppFabric специально разработаны для развертывания приложений, использующих WCF для обмена данными, и управления ими. Функции размещения включают разнообразные средства и параметры конфигурации, специально разработанные для приложений с поддержкой WCF.
Пример создания WCF-сервиса, работающего внутри службы Windows
Windows Communication Foundation – программная платформа от Microsoft для создания, настройки и развертывания распределенных сетевых сервисов. WCF-runtime и его пространство имен System.ServiceModel, представляющее его главный программный интерфейс, это преемник технологий создания распределенных систем, успешно применяемых разработчиками для создания распределенных приложений на платформе Windows в последнее десятилетие. Разберём тестовый пример создания WCF-сервиса.
Открываем Visual Studio 2015 и создаём новый проект типа Class Library. Проект назовём WCFMyServiceLibrary.
Файл Class1.cs переименуем в MyService.cs и добавим ещё один класс, файл для которого назовём IMyService.cs.
Добавим ссылку на сборку System.ServiceModel.
На этом разработка сервиса завершена. Переходим к созданию службы 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 я решил не добавлять — обойдёмся и без него).
Примечание. Аналогичного результата можно было добиться, запустив
Т.е. можно запускать эту утилиту, указав только одну конечную точку, либо http либо net.tcp.
В том же решении (Solution) создадим обычное приложение Windows Forms. Назовем его WindowsFormsApplication1
Добавим в этот проект ссылку на System.ServiceModel и, конечно же,
Добавим в этот проект файл MyServiceProxy.cs (именно его мы сгенерировали утилитой SvcUtil.exe). При этом следует добавить в файл MyServiceProxy.cs следующие строки:
После этого, мы сможем ссылаться на класс MyServiceClient (этот класс создан программой SvcUtil.exe), указав в файле формы директиву.
Поступим неординарно – и не будем добавлять файл App.Config в проект клиента!
Затем набросаем на форму 3 кнопки, текстовое поле textBox1 (пользователь вводит сюда строку для отправки на сервер) и поле richTextbox1 (имитация подсистемы сообщений нашего приложения – именно в это поле будут поступать сообщения от программы, в том числе и те, что вернул нам сервис)
Кнопка btn_Start – создаёт клиента
Кнопка btn_Send – отправляет сервису текстовую строку из текстового поля
Кнопка btn_Close – удаляет клиента из памяти и закрывает приложение
Компилируем и запускаем с другой машины из той же сети – и тестируем сервис, нажав сначала btn_Start, а затем отправляя сервису сообщения нажатием btn_Send.
Заметим, что в данном примере на клиенте мы совсем не использовали конечную точку
http://localhost:9001/MyService
а работали только с
net.tcp://localhost:9002/MyService
(вы легко сможете это сделать самостоятельно – раз уж вам net.tcp по плечу, то уж http-то с закрытыми глазами сделаете).
Кроме того, мы не использовали файл App.config, создав на клиенте конечную точку не с помощью настроек, а с помощью кода C#. Причины тому – субъективные – автор не любит возиться с XML-настройками, а по возможности всё делает явно в коде. Спасибо за внимание!
Лирическое отступление. Автор статейки познакомился с языком C# в марте сего года, первое приложение на C# написал в мае (до этого много лет формошлёпил на Delphi и даже на MS Access).
Узел службы WCF (WcfSvcHost.exe)
Windows узел службы Communication Foundation (WCF) (WcfSvcHost.exe) позволяет запустить отладчик Visual Studio (F5) для автоматического размещения и тестирования реализованной службы. Затем можно протестировать службу с помощью клиента WCF Test (WcfTestClient.exe) или собственного клиента, чтобы найти и исправить возможные ошибки.
Узел службы WCF
Узел службы WCF выполняет перечисление служб в проекте службы WCF, загружает конфигурацию проекта и создает экземпляр узла для каждой найденной службы. это средство интегрировано в Visual Studio через шаблон службы WCF и вызывается при запуске отладки проекта.
С помощью узла службы WCF можно разместить службу WCF (в проекте библиотеки службы WCF) без написания дополнительного кода или фиксации на определенном узле во время разработки.
Узел службы WCF не поддерживает частичное доверие. если вы хотите использовать службу wcf в режиме частичного доверия, не используйте шаблон службы wcf Service Library Project в Visual Studio для создания службы. вместо этого создайте новый веб-сайт в Visual Studio, выбрав шаблон веб-сайт службы wcf, который может размещать службу на сервере, на котором поддерживается частичное доверие WCF.
Типы проектов, размещенные узлом службы WCF
Однако следует отметить, что это средство не окажет содействия в настройке узла. Для этой задачи необходимо вручную отредактировать файл App.config. Это средство также не выполняет проверку подлинности пользовательских файлов конфигурации.
Не следует использовать узел службы WCF для размещения служб в рабочей среде, так как он не был разработан для этой цели. Узел службы WCF не поддерживает требования к надежности, безопасности и управляемости такой среды. Вместо этого используется IIS, поскольку таким образом обеспечивается высочайшие свойства надежности и мониторинга, предоставляющие предпочтительное решение для служб размещения. После завершения разработки служб следует перенести службы из узла службы WCF в службы IIS.
Сценарии для использования узла службы WCF в Visual Studio
| Параметр | Значение |
|---|---|
| /client | Необязательный параметр, задающий путь к исполняемому файлу для запуска после размещения служб. Запускается тестовый клиент WCF, следующий за размещением. |
| /clientArg | Задайте строку в качестве аргумента, передаваемого настраиваемому клиентскому приложению. |
| /? | Отображает текст справки. |
Использование тестового клиента WCF
После создания нового проекта службы WCF и нажатия клавиши F5 для запуска отладчика узел службы WCF начинает размещать все службы, найденные в проекте. Тестовый клиент WCF автоматически открывает и отображает список конечных точек служб, определенных в файле конфигурации. В главном окне можно проверить параметры и вызвать службу.
Использование настраиваемого клиента
При нажатии клавиши F5 для повторного запуска службы узел службы WCF автоматически запускает пользовательский клиент при запуске отладчика.
/client:»path/CustomClient.exe» /clientArg:»arguments that are passed to Client»
Например, если используется шаблон библиотеки служб синдикации, то можно использовать следующие аргументы командной строки:
Указание отсутствия клиента
Использование настраиваемого узла
Пользовательский интерфейс узла службы WCF
При возникновении ошибок во время размещения службы откроется диалоговое окно «узел службы WCF», в котором отображаются соответствующие сведения.
Главное окно узла службы WCF содержит два меню:
Основное окно службы WCF содержит две области:
Первая область — Service. В ней содержится список, отображающий основные сведения всех служб. К ним относятся следующие сведения:
Служба: список всех служб.
Состояние: отображает состояние службы. Допустимые значения: «Started», «Stopped» и «Error».
Адрес метаданных: отображает адрес метаданных служб.
Остановка узла службы WCF
Вы можете завершить работу узла службы WCF следующими четырьмя способами.
Останавливает сеанс отладки в Visual Studio.
Выберите выход из контекстного меню значка службы WCF значок «область уведомлений системы».
Выйдите из тестового клиента WCF, если он используется.
Windows Communication Foundation (WCF) служба
Давайте рассмотрим процесс создания и вызова службы WCF.
Создание службы WCF
Для начала необходимо создать новый проект WCF. Пусть наша Windows Communication Foundation служба будет возвращать количество оставшихся дней до нового года.
Visual studio создаст интерфейс и класс службы по умолчанию с именем IService1.cs и Service1.svc.
Нам необходимо переименовать их в соответствии с нашей предметной областью.
Давайте рассмотрим интерфейс INewYearService. Для начала нам необходимо в теле интерфейса объявить метод, который будет предоставлять служба для вызова. Для этого его необходимо пометить атрибутом [OperationContract].
Как вы видите данный метод возвращает экземпляр класса TimeToNewYear. Это вспомогательный класс, содержащий значения времени до нового года. Ниже приведена его структура. Для того, чтобы данный класс можно было использовать в качестве возвращаемого аргумента, его необходимо пометить атрибутом [DataContract], а свойства, доступные для чтения клиенту в возвращаемом значении помечаются атрибутом [DataMember].
Теперь нам остается реализовать интерфейс Windows Communication Foundation службы в классе NewYearService.svc.cs следующим образом:
Давайте проверим работу нашей службы wcf. Для этого нажмем кнопку Начать отладку. Обратите внимание, что возможные два варианта поведения системы. Если мы начнем отладку находясь в NewYearService.svc, от откроется отладчик службы. Во всех остальных случаях откроется окно браузера. Давайте рассмотрим каждый из вариантов подробнее.
Браузер
После запуска отладки отобразится браузер с файловой структурой нашей службы wcf.
Нам необходимо нажать на ссылку с именем нашей службы NewYearService.svc. Если все работает корректно, то мы увидим следующее окно, иначе будет показано сообщение с ошибкой.
Тестовый клиент WCF
В левой верхней части отладчика можно увидеть структура нашей службы wcf. Для проверки нашего метода выполним двойной щелчок левой кнопкой мыши по его имени. В правой части отладчика откроется форма запроса. Мы можем указать значение, которое будет передано в метод.
После установки передаваемых значений необходимо нажать кнопку Вызвать. Появится предупредительное сообщение. Можно смело ставить галочку Не выводить это сообщение в дальнейшем и нажимать кнопку ОК.
После этого в нижней правой части отладчика будет отображены значения возвращаемые нашей службой wcf.
Консольный клиент для WCF
Теперь нам необходимо создать клиент, который будет обращаться к нашей службе wcf. Для этого для начала создадим новое консольное приложение.
В созданном консольном приложении нам необходимо добавить ссылку на службу wcf.
В открывшимся окне службы необходимо указать имя службы wcf и ввести ее адрес.
Для простоты можно нажать кнопку Найти, тогда адрес службы wcf будет определен автоматически.
После этого необходимо развернуть дерево Windows Communication Foundation службы, чтобы удостоверится что выбран правильность выбора. В правой части должен быть отображен вызываемый метод.
Если настройка прошла корректно, то в обозревателе решения в консольном приложении отобразится ссылка на нашу службу wcf.
Теперь нам остается только обратиться к нашей службе, чтобы взывать метод и вывести результат на экран.
Перед началом отладки не забудьте установить консольное приложение автозагружаемым проектом. Получаем следующий результат.
Web клиент для WCF
Теперь рассмотрим, как нам обратиться к службе wcf из веб-приложения. Процесс подключения службы не отличается от подключения в консольном приложении. Давайте рассмотрим как можно настроить авторизацию с помощью Windows. Это потребует дополнительной настройки приложения. Для начала создадим проект нового MVC приложения.
Нажимаем кнопку ОК, и попадаем в меню настройки создания веб-приложения. Выберем MVC шаблон и изменим способ авторизации. Для этого нажмем на кнопку Изменить способ проверки подлинности.
Выбираем авторизацию с помощью Windows и нажимаем ОК в обоих окнах.
Теперь необходимо будет подождать кое-то время, чтобы создался проект и все библиотеки были загружены и подключены.
Для того, чтобы IISExpres перестала ругаться на нас за попытку создания windows-аутентификации нужно сделать ряд действий в наше службе.
Нужно дополнить наш web.config
Находим раздел и в нем вставляем следующее.
Далее нужно указать разделы биндинг и сервис
Раздел дополняем такой вот строчкой. В ней мы говорим, что именно такая схема аутентификации будет использоваться у нас.
На этом настройка web.config заканчивается. В итоге у нас должен получиться файл примерно следующего содержания.
Настройка applicationhost.config
Далее идем в папку vs нашего проекта (она скрыта по умолчанию). В ней ищем папку config, а уже в ней находим файл applicationhost.config, его то нам нужно будет поправить.
Находим вот такой раздел. Все Deny меняем на Allow, разрешая изменение установленного по умолчанию режима аутентификации.
Далее находим данную настройку. В ней false меняем на true, разрешая механизму работать.
И под конец находим вот эту настройку. Тут мы true меняем на false. Говоря нашему IISExpres, чтобы он не блокировал службу windows-аутентификации.
После этого сохраняем все конфигурационные файлы и пробуем сделать ссылку на службу wcf аналогично как при добавлении службы в консольное приложение.
Изменим контроллер главной страницы web-приложения, чтобы взывать нашу службу wcf.
Теперь нам осталось только изменить представление, чтобы вывести результат работы Windows Communication Foundation службы на экран пользователя.
Получаем следующий результат работы веб-приложения.
Итоги WCF
Исходный код приложения можно скачать из репозитория https://github.com/shwanoff/wcf.
Мы подробно рассмотрели процесс создания и настройки Windows Communication Foundation службы, а также продемонстрировали как можно подключится к wcf через консольное и веб-приложение. Также рекомендую прочитать статью Принципы SOLID C#. И не забудьте подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.
