Игорь Чакрыгин Игорь Чакрыгин

У любой задачи существует по крайней мере одно очевидное и невероятно простое для понимания неправильное решение

WCF - Подключение к локальному wcf-сервису по net.tcp

В данной статье я бы хотел рассказать о том, как можно на локальном компьютере в Visual Studio запустить wcf-сервис, который был бы доступен по протоколу net.tcp.

Итак, предположим, что у нас имеется приложение (в моём случае это web-сайт, хотя это и не обязательно), которое получает данные от десятка различных wcf-сервисов используя при этом NetTcpBinding. В один прекрасный момент у нас возникает желание выполнить отладку одного из этих сервисов. Используя IIS Express мы, конечно, можем запустить этот сервис локально, однако он будем доступен только по протоколу http. Это означает, что в файле конфигурации приложении нам придётся менять не только адрес сервиса, но и тип привязки, что в большинстве случаев не очень удобно (особенно если постоянно приходится переключаться с локального сервиса на нелокальный).

Попробуем запустить wcf-сервис на локальном компьютере таким образом, чтобы он был доступен по протоколу net.tcp.

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

Для начала создадим сам сервис.

Откроем Visual Studio и создадим новый проект (ASP.NET Empty Web Application). Назовём его Service. Добавим в проект wcf-сервис Hello.svc. Структура полученного проекта будет следующей:

Сам сервис будет содержать один метод SayHello. Он будет получать строку в параметре name (например, "World") и будет возвращать строку приветствия (например, "Hello, World!").

Создание хоста для сервиса

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

Добавим к уже созданному проекту ещё один проект (Console Application). Назовём его Service.Host и добавим в него ссылки на проект Service и на сборку System.ServiceModel. После этого изменим код файла Program.cs следующим образом:

Тут всё достаточно просто. Мы используем два uri (serviceHttpAddress и serviceNetTcpAddress) которые определяют адреса, по которым сервис будет доступен после вызова метода Open объекта serviceHost, а чтобы приложение сразу же не закрылось, заставляем его ожидать, пока пользователь не нажмёт какую-нибудь клавишу.

Теперь если мы запустим это консольное приложение (делать это нужно с правами администратора), а сами откроем браузер и перейдём по адресу http://localhost:10001/HelloService/, то увидим стандартную страницу с информацией о сервисе. При этом, на этой странице будет сказано, что публикация метаданных о сервисе отключена.

Чтобы получить wsdl-файл c метаданными сервиса добавим в файл App.config следующие строки:

Теперь, если мы перезапустим наше консольное приложение и снова перейдём по адресу http://localhost:10001/HelloService/, то сможем получить ссылку на wsdl-файл, который необходим для генерации кода на клиенте.

Тестирование

Осталось убедиться, что сервис действительно доступен по протоколу net.tcp.

Создадим новый проект (Console Application). Назовём его Client и добавим в него ссылку на созданный нами сервис используя ссылку на wsdl-файл, полученную ранее (консольное приложение Service.Host в это время должно быть запущено, чтобы сервис был доступен).

Добавим конечную точку в файл конфигурации.

Изменим код файла Program.cs следующим образом:

Теперь, если мы сначала запустим консольное приложение Service.Host, а затем Client, то в последнее выведет нам строку:

Hello, World!

Таким образом наш сервис действительно доступен по протоколу net.tcp. С тем же успехом мы можем установить breakpoint`ы в wcf-сервисе и выполнять его отладку.

Скачать демо

Комментариев нет :

© Игорь Чакрыгин. Все права защищены при помощи чёрной магии. Технологии Blogger.