Разработка клиентского приложения для WCF-службы проводится здесь: Основы разработки WCF-служб. Часть 4. Клиент для службы.
Задача: Разместите службу, созданную в процессе статьи: Основы разработки WCF-служб. Часть 3. Разработка простой WCF-службы, в отдельном исполняемом приложении.
Благодаря классу "ServiceHost" размещение службы в отдельном процессе – вполне тривиальная задача.
Создайте простое консольное приложение. Назовите его, например, "d_servicehost".
Как вы уже, наверное, заметили, физически служба WCF представляет собой dll-библиотеку. Чтобы разместить ее в исполняемом приложении, ее необходимо подключить. Для этого щелкните в "Обозревателе решений" по "Ссылки" и "Добавить ссылку".
Откроется окно добавления ссылки на библиотеки классов или пространства имен. Выберите вкладку "Обзор", а в ней выберите dll-библиотеку службы, созданную во время этой статьи: Основы разработки WCF-служб. Часть 3. Разработка простой WCF-службы. Возможно, она находится у вас по адресу: "/b_FirstService/b_FirstService/bin/Debug/b_FirstService.dll".
Название службы в виде "b_FirstService" должно появиться в области "Ссылки" "Обозревателя решений".
Кроме того, необходимо подключить пространство имен System.ServiceModel для работы с WCF. В прежних статьях Visual Studio делал это автоматически, но теперь нужно сделать это вручную. Щелкните по "Ссылки" и "Добавить ссылку". Во вкладке "Платформа" найдите и выберите "System.ServiceModel".
Затем подключите обе библиотеки в рамках вашей программы через "using":
1 2 | using b_FirstService; using System.ServiceModel; |
Начнем писать код программы. Первой строкой инициализируем экземпляр класса "ServiceHost":
1 | ServiceHost host = new ServiceHost(); |
Однако как конструктор класс "ServiceHost" требует указать, какого типа службу необходимо запустить и по какому адресу это сделать. Тип службы определить легко – это и есть наша ранее созданная служба. Немного сложнее с адресом, но его можно взять откуда угодно: с любого файла app.config, с которыми мы работали ранее.
Откройте файл app.config для клиентского приложения из этой работы: Основы разработки WCF-служб. Часть 4. Клиент для службы. В области
Теперь модифицируем конструктор "ServiceHost" таким образом:
1 2 | ServiceHost host = new ServiceHost(typeof(b_FirstService.WorkBook), new Uri("http://localhost:8731/Design_Time_Addresses/b_FirstService/Service1/")); |
Таким образом, мы явно указали службу, экземпляр которой нужно создать, и базовый адрес, по которому будет размещена служба.
Кроме того, необходимо создать конечную точку – центр обмена сообщениями службы. У класса "ServiceHost" есть необходимый для этого метод "AddServiceEndpoint".
Любая конечная точка, как уже было сказано, характеризуется тремя составляющими: адресом, привязкой и контрактом. Поэтому при создании точки, необходимо указать ее адрес, привязку и контракт. Однако если адрес не указан, то конечная точка располагается по базовому адресу службы.
Так как у нас всего лишь одна конечная точка и очень простое приложение, то адрес конечной точки указывать не будем. Напишите в следующей строке:
1 | host.AddServiceEndpoint(typeof(b_FirstService.IWorkBook), new WSHttpBinding(), ""); |
Здесь b_FirstService.IWorkBook – это контракт службы, а BasicSHttpBinding – это та привязка, что поддерживает служба. Вы можете посмотреть конфигурационный файл любого ранее созданного приложения из предыдущих статей и заметите, что все они используют привязку BasicHttpBinding.
Как только конечная точка добавлена – владелец (хост) со службой готов к запуску. Произведем вызов метода Open для экземпляра "ServiceHost":
1 | host.Open(); |
При вызове этого метода "ServiceHost" считывает конфигурацию службы, список конечных точек и начинает прослушивать адреса точек.
Выведем сообщение о том, что служба запущена.
1 | Console.WriteLine("Служба запущена"); |
И запросим от пользователя нажатия кнопки
1 | Console.ReadLine(); |
После того, как пользователь нажмет
1 | host.Close(); |
В итоге, должен получиться примерно такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using b_FirstService; using System.ServiceModel; namespace d_servicehost { class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(b_FirstService.WorkBook), new Uri("http://localhost:8731/Design_Time_Addresses/b_FirstService/Service1/")); host.AddServiceEndpoint(typeof(b_FirstService.IWorkBook), new BasicHttpBinding(), ""); host.Open(); Console.WriteLine("Служба запущена"); Console.ReadLine(); host.Close(); } } } |
Постройте и запустите приложение. Если будет выведено сообщение "Служба запущена", значит, служба готова к обработке клиентов. Запустите клиента из третьей работы. Его приложение находиться, скорей всего, по адресу: "\c_client\c_client\bin\Debug\c_client.exe". Поработайте с клиентом, убедитесь, что служба выполняет свои действия.
Попробуйте изменить привязку конечной точки службы с BasicHttpBinding() на WSHttpBinding(). Постройте и запустите службу. Запустите клиента вновь. Убедитесь, что клиент не может работать со службой, которая использует другую привязку. Также он не будет работать со службой по другому адресу или с другим контрактом.
В следующей статье рассматривается размещение службы как сервиса Windows: Основы разработки WCF-служб. Часть 6. Размещение WCF-службы как службы Windows.