Службы wcf в windows 10 что это

Обновлено: 07.07.2024

Будущее настало. Cloud Computing доступен массам, а распределенная архитектура теперь является естественной потребностью не только крупных организаций, но и самых что ни на есть рядовых граждан. Сегодня мы рассмотрим систему быстрого развертывания распределенных приложений в домашних условиях.

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

Два сапога…

Для начала ознакомимся с двумя фундаментальными методиками организации любой распределенки.
В распоряжении архитектора распределенных систем имеются два подхода: SOAP и REST.

Структура SOAP-запроса

Формат SOAP-ответа формируется аналогичным образом.

Таким образом, данные, полученные по указанному URL, при повторном обращении к ним могут быть кэшированы.
На первый взгляд, разница несущественна, ведь так или иначе клиент получает необходимые ему данные, однако, результаты проектирования системы в соответствии с этими подходами кардинально отличаются. Непосредственное обращение к ресурсам сервиса с помощью REST-подхода позволяет поднять степень конфиденциальности клиентской стороны, так как запросы могут фиксироваться исключительно на стороне веб-службы, чего не скажешь о SOAP-аналоге, где происходит непосредственный обмен пакетами между клиентской и серверной частью. Еще один аргумент не в пользу SOAP: обязательный разбор клиентом полученного XML-кода требует определенных трудозатрат, что плохо сказывается на масштабируемости задачи. REST в этом плане более практичен и не требует специальных оптимизационных мероприятий.

Короче говоря, выбор того или иного подхода должен быть основан, прежде всего, на особенностях решаемой задачи. Например, организация grid-системы, занимающейся поиском коллизии MD5-хешей, и абсолютно нелегального ботнета, организующего распределенный поиск заветной «строчки» по известному MD5-хешу – задачи, требующие индивидуального подхода.

Теперь вернемся непосредственно к WCF и посмотрим, какой набор инструментов предоставляется разработчику.

Сквозь призму Microsoft

WCF «по умолчанию» основан на SOAP. Однако, если использовать только часть определенных слоев, то можно организовать и REST-подход.

В Windows Communication Foundation есть три ключевых понятия:

  1. Адрес (Address);
  2. Связывание (Binding);
  3. Контракт (Contract).

Эти три атрибута определяют понятие так называемой «оконечной точки» сервиса. Оконечная точка – «орган» связи сервиса с внешним миром. Ее «Адрес», как ни странно, определяет адрес нахождения сервиса. Именно для предоставления адресной информации предоставляемых ресурсов используется URI (унифицированный локатор ресурсов, проще говоря, их адрес).

Есть контакт!

Рассмотрим создание оконечной точки WCF-службы для того, чтобы последняя могла предоставлять потенциальным клиентам свои методы.
Объявление Контакта заключается в создании класса и привязки к нему атрибута ServiceContractAttribute (и тут Remoting). В свою очередь, метод класса, который будет передавать обработанные данные во внешний мир, также должен помечаться атрибутом OperationContractAttribute. Рассмотрим описанные действия на примере создания метода службы, который принимает два целых числа и отправляет их сумму обратно во внешнюю среду:

Прототип Контракта

[ServiceContract]
public interface AddIntPoint
[OperationContract]
int Add(int x, int y);
>

Как можно догадаться из определения Контакта – в нем должно произойти сложение двух чисел, а вот его реализация:

Реализация Контракта

public class AddService : AddIntPoint
public int Add(int x, int y)
< return x + y; >
>

Теперь класс AddService является классом WCF-сервиса и может быть вызван клиентской частью удаленно.
Все гениальное просто. Ты можешь создать абсолютно любой метод, например, PasswordCrack (string MD5hash) и ждать заветного результата. Что самое примечательное – ты не будешь замечать, где происходят расчеты (на локальной машине или где-то на сервере в Зимбабве), так как WCF-прокси сам организует соединение с удаленной службой и аккуратно передаст тебе результаты выполнения удаленного метода.
Следующий код демонстрирует определение оконечной точки:

Определение Оконечной Точки

public class WCFServiceApp
//метод определения оконечной точки и запуска сервиса
public void DefineEndpointImperatively()
<. >
//эквивалентная оконечная точка в конфигурационном файле
public void DefineEndpointInConfig()
<. >
>

.
ServiceHost sh = new ServiceHost(typeof(AddService));
sh.AddServiceEndpoint(
typeof(AddIntPoint),
new WSHttpBinding(),
"http://localhost/AddService/Ep1");
sh.Open();
.

public class WCFClientApp
//инициализация канала передачи данных
public void SendMessageToEndpoint()
MathProxy proxy = new MathProxy();
int result = proxy.Add(35, 7);
>
>

Аналогичным образом клиент хранит свою оконечную точку для поддержки связи с оконечной точной сервиса. Кстати говоря, сервисы могут предоставлять целую коллекцию оконечных точек, а значит, предоставляют возможность использовать несколько различных каналов передачи данных (транспортов) и методов. Это дает возможность абстрагироваться от канала передачи данных и расширить множество потенциальных клиентских платформ за счет использования различных протоколов передачи данных. Например, ты можешь синхронизировать данные, поступающие с твоего основного ботнета и ботнета, основанного исключительно на мобильных платформах. Таким образом ты потенциально расширяешь спектр зараженных машин.

Например, ты можешь синхронизировать данные, поступающие с твоего основного ботнета и ботнета, основанного исключительно на мобильных платформах. Таким образом ты потенциально расширяешь спектр зараженных машин

Конфигурационный файл сервиса, расположенный вне исходного кода, позволяет легко активировать/деактивировать дополнительные опции сервиса (настройки безопасности, проверка целостности передаваемых данных и т.п.).

Что же там, за горизонтом?

К спектру технологий 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.


Просмотр wcf службы в браузере

Тестовый клиент WCF


В левой верхней части отладчика можно увидеть структура нашей службы wcf. Для проверки нашего метода выполним двойной щелчок левой кнопкой мыши по его имени. В правой части отладчика откроется форма запроса. Мы можем указать значение, которое будет передано в метод.



После этого в нижней правой части отладчика будет отображены значения возвращаемые нашей службой wcf.

обзор службы wcf

Консольный клиент для WCF

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



В созданном консольном приложении нам необходимо добавить ссылку на службу wcf.


В открывшимся окне службы необходимо указать имя службы wcf и ввести ее адрес.


Для простоты можно нажать кнопку Найти, тогда адрес службы wcf будет определен автоматически.


После этого необходимо развернуть дерево Windows Communication Foundation службы, чтобы удостоверится что выбран правильность выбора. В правой части должен быть отображен вызываемый метод.


Если настройка прошла корректно, то в обозревателе решения в консольном приложении отобразится ссылка на нашу службу wcf.


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

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


Web клиент для WCF

Теперь рассмотрим, как нам обратиться к службе wcf из веб-приложения. Процесс подключения службы не отличается от подключения в консольном приложении. Давайте рассмотрим как можно настроить авторизацию с помощью Windows. Это потребует дополнительной настройки приложения. Для начала создадим проект нового MVC приложения.


Нажимаем кнопку ОК, и попадаем в меню настройки создания веб-приложения. Выберем MVC шаблон и изменим способ авторизации. Для этого нажмем на кнопку Изменить способ проверки подлинности.


Выбираем авторизацию с помощью Windows и нажимаем ОК в обоих окнах.


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

Для того, чтобы IISExpres перестала ругаться на нас за попытку создания windows-аутентификации нужно сделать ряд действий в наше службе.

Нужно дополнить наш web.config

Добавляем в любую точку раздела <configuration>, если отсутствует раздел webServer или дополняем уже существующий.

Находим раздел <system.web> и в нем вставляем следующее.

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

Раздел <serviceBehavior><behavior> дополняем такой вот строчкой. В ней мы говорим, что именно такая схема аутентификации будет использоваться у нас.

На этом настройка web.config заканчивается. В итоге у нас должен получиться файл примерно следующего содержания.

Настройка applicationhost.config


Находим вот такой раздел. Все Deny меняем на Allow, разрешая изменение установленного по умолчанию режима аутентификации.

Далее находим данную настройку. В ней false меняем на true, разрешая механизму работать.

И под конец находим вот эту настройку. Тут мы true меняем на false. Говоря нашему IISExpres, чтобы он не блокировал службу windows-аутентификации.

После этого сохраняем все конфигурационные файлы и пробуем сделать ссылку на службу wcf аналогично как при добавлении службы в консольное приложение.


Изменим контроллер главной страницы web-приложения, чтобы взывать нашу службу wcf.

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

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

wcf mvc web app

Итоги WCF

Будучи всеобъемлющей системой работы со службами, WCF вводит терминологию, с которой вы должны быть знакомы. Термины не обязательно обозначают какие-то новые концепции, однако описывают согласованную систему понятий, которая необходима для обсуждения новой технологии.

Обмен данными между клиентом и службой


Рис. 23.1. Обмен данными между клиентом и службой

Коммуникация между оконечными точками клиента и службы


Рис. 23.2. Коммуникация между оконечными точками клиента и службы

Как показано на рис. 23.3, главная программа может создать экземпляр класса ServiceHost, который будет отвечать за создание оконечных точек службы.

Размещение службы

Службы данных WCF (Silverlight)

Создание WCF сервиса

Всего имеется 4 шаблона, через которые можно реализовать веб-сервисы:

  • Silverlight-enabled WCF Service. Этот шаблон создает веб-службу, которая предоставляет данные клиенту Silverlight или внешнему интерфейсу. Шаблон может быть добавлен на веб-сайт или в проект веб-приложения для создания службы WCF, которая включает код и конфигурацию службы, поддерживающей взаимодействие с клиентом Silverlight.
  • AJAX - enabled WCF Service. Этот шаблон предоставляет элемент управления AJAX как службу WCF.
  • WCF Service Application. Это пользовательский шаблон, который предоставляет быстрый способ для добавления служб WCF в существующие проекты Visual Studio.
  • Web Service. Шаблон обычного веб-сервиса.

В Silverlight - приложение добавляется файл Silverlight-enabled WCF Service ( Рис 23.4). Файл будет иметь расширение svc.

Добавление WCF сервиса к Silverlight проекту


увеличить изображение
Рис. 23.4. Добавление WCF сервиса к Silverlight проекту

В файле сгенерируется код. Атрибут [OperationContract] своего рода разделитель для методов в сервисе, при добавлении очередного метода, необходимо добавлять данный атрибут :

В проекте Silverlight добавляем ссылку на сервис. В открывшемся окне (Рис 23.5) необходимо выбрать нужные сервисы. VS автоматически создаст ServiceReferences.ClientConfig , в котором находятся настройки привязки сервиса.

Добавление ссылки на созданный сервис


Рис. 23.5. Добавление ссылки на созданный сервис

Файл Web .config, так же претерпит изменение:

Большинство методов в службах Windows Communication Foundation (WCF) может быть вызвано как синхронно, так и асинхронно. Асинхронный вызов метода позволяет приложению работать во время выполнения этого вызова через медленное соединение. Пример асинхронного вызова реализован во фрагменте кода:

При запуске приложения откроется окно браузера, где выполнится метод, который реализован в WCF сервисе ( Рис 23.6).

WCF - Windows Communication Foundation, программный фреймворк, используемый для обмена данными между приложениями.

Почему стоит использовать это решение, а не сделать свой клиент-сервер ?

1. Данное решение многопоточное. Это значит, что одновременно могут серверу поступить запросы от многих клиентов и клиенты не будут ждать друг друга в очереди, а каждый запрос будет выполнен в отдельном параллельном потоке.

2. Решение не имеет большого объема кода, а значит понять данный код легче.

3. Вам не придется вдаваться в подробности работы между клиентом и сервером: тот самый случай когда установил и забыл о проблемах.

Интерфейс определяет как будет выглядеть объект, в котором будут методы работы нашего клиент-сервера. В WCF данный интерфейс называется контрактом.

Замечание: если Вы создаете клиент-сервер не для теста в рамках одного приложения, а клиент и сервер будут разными приложениями, то Вам следует создать интерфейс ITransferObject и класс TransferObject в отдельной библиотеке dll. В таком случае Ваше клиентское и серверное приложения будут использовать одни классы и интерфейсы, что является Важным условием для WCF.
В данном примере определим, что данный объект будет иметь 2 простых метода:
GetSum - подсчет суммы двух целых чисел
GetMultiPly - подсчет умножения двух целых чисел

[ServiceContract] - необходимый модификатор чтобы указать что данный интерфейс является контрактом WCF службы.
[OperationContract] - необходимый модификатор чтобы указать что данные методы будут использоваться в контракте.

Класс TransferObject унаследуем от интерфейса ITransferObject. Данный класс будет иметь простую реализацию наших методов.
При вызове метода GetSum будут переданы 2 целых числа.Ответом выполним сложение этих чисел.

Соответственно и с методом GetMultiPly - ответом выполним перемножение этих чисел.

public class TransferObject : ITransferObject < public int GetSum(int a, int b) < return a + b; >public int GetMultiPly(int a, int b) < return a * b; >> static void Main(string[] args) < var serviceAddress = "127.0.0.1:10000"; var serviceName = "MyService"; var host = new ServiceHost(typeof(TransferObject), new Uri($"net.tcp:///")); var serverBinding = new NetTcpBinding(); host.AddServiceEndpoint(typeof(ITransferObject), serverBinding, ""); host.Open(); Console.ReadKey(); >

serviceAddress - это адрес на котором сервер будет ожидать подключения от клиентов.
serviceName - имя сервиса. На каждом адресе может быть большое количество сервисов. Имя сервиса - часть адреса, по которому клиент подключается к серверу.
Далее происходит запуск серверной части WCF. Чтобы приложение не закрылось после отработки всего кода, добавлено Console.ReadKey() - ожидание нажатия любой клавиши.

static void Main(string[] args) < var serviceAddress = "127.0.0.1:10000"; var serviceName = "MyService"; Uri tcpUri = new Uri($"net.tcp:///"); EndpointAddress address = new EndpointAddress(tcpUri); NetTcpBinding clientBinding = new NetTcpBinding(); ChannelFactory<ITransferObject> factory = new ChannelFactory<ITransferObject>(clientBinding, address); var service = factory.CreateChannel(); var sum = service.GetSum(4, 7); var multiply = service.GetMultiPly(3, 17); Console.WriteLine($"sum = "); Console.WriteLine($"multiply = "); Console.ReadKey(); >

Строка подключения к серверу такая же как используется в серверной части: адрес_сервера + имя сервиса.

Далее происходит инициализация клиенской части WCF и вызов методов сложения и умножения чисел.

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