Задача: Для приложения, созданного в ходе статьи Основы разработки WCF-служб. Часть 7. Добавление нескольких конечных точек службы, осуществить публикацию метаданных через протокол "http".
У службы есть два способа опубликовать свои метаданные. Можно предоставить метаданные через HTTP-протокол, или использовать выделенную конечную точку. Публикация метаданных осуществляется через отдельную конечную точку. Чтобы служба автоматически обрабатывала запросы к этой точке, необходимо обозначить для нее специальное поведение.
Откройте проект, созданный в ходе предыдущей статьи (если вы не желаете терять код этой работы, то следует скопировать папку проекта в отдельное место).
1. Просмотр состояния публикации метаданных.
Запустите службу. В прошлой работе для службы был выделен базовый адрес:
1 | http://localhost:8080/bookservice |
Откройте этот адрес в любом браузере. Вы получите такую страницу:
На этой странице вам сообщается, что служба не публикует метаданные, а, следовательно, о ее работе сложно будет узнать потенциальным клиентам (как мы помним, клиента для статьи Основы разработки WCF-служб. Часть 4. Клиент для службы мы делали по службе из 3-ой статьи цикла, где публикация метаданных автоматически была подключена Visual Studio. Начиная со статьи №5 за публикацию метаданных должен отвечать разработчик, то есть вы).
2. Добавление точки обмена метаданными через код службы.
Как уже отмечалось, службу можно конфигурировать не только через app.config, но и непосредственно в программном коде. Сделаем так, чтобы обычные конечные точки поддерживались через app.config, а mex задавалась в коде службы.
Остановите службу. Откройте код службы и между строчками
1 | ServiceHost host = new ServiceHost(typeof(b_FirstService.WorkBook)); |
и
1 | host.Open(); |
добавьте код:
1 2 3 4 5 | ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; host.Description.Behaviors.Add(behavior); host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), new Uri("http://localhost:8080/bookservice/mex")); |
Кроме того, подключите пространство имен:
1 | using System.ServiceModel.Description; |
В этом коде для владельца службы инициируется поведение обмена метаданными с помощью класса ServiceMetadataBehavior. Включается обмен данными через протокол http строкой:
1 | behavior.HttpGetEnabled = true; |
Далее для службы вводится новая конечная точка обмена метаданными.
Запустите службу. Обновите страницу браузера. Должно отобразиться окно, в котором указывается, что метаданные опубликованы, и предлагается их получить по адресу: http://localhost:8080/bookservice?wsdl
1 | http://localhost:8080/bookservice?wsdl |
Перейдите по этому адресу, и вы убедитесь в том, что интерфейсы и контракты службы описаны на языке WSDL. Здесь есть описание и класса Book, и класса WorkBook со всеми его операциями.
3. Добавление поведения службы через конфигурационный файл для обмена метаданными
Теперь попробуем включить поддержку метаданных исключительно через конфигурационный файл. Произведем эти операции через автоматизированный редактор.
Остановите службу. Удалите весь код, который мы писали в этой работе ранее.
Вызовите редактор конфигурации службы WCF для файла "App.config", так же, как и в 7-ой статье. В списке конфигурации перейдите к разделу "Advanced", а далее "ServiceBehaviors". Нажмите "New Service Behavior Configuration".
В появившемся разделе "Behavior: NewBehavior" нажмите "Add" и добавьте элемент "serviceMetadata". Далее для поведения "NewBehavior" будет создан новый элемент "serviceMetadata".
Перейдите к нему и для параметра "HttpGetEnabled" поставьте значение "True". Это позволит службе публиковать метаданные через протокол http.
Далее перейдите к основным настройкам службы, разделу "b_FirstService.WorkBook". Там, для параметра "BehaviorConfiguration" выставьте значение в виде "NewBehavior".
Сохраните конфигурацию. Закройте редактор. Запустите службу. Если при запуске произойдет ошибка, проверьте ваш файл "App.config" на наличие подключения сертификатов X.509.
4. Проверка работы службы
Итак, сторонние клиенты и службы могут автоматически получить информацию о нашей службе. Проверим это через "Тестовый клиент WCF". Запустите командную строку Visual Studio 2008. Пропишите:
1 | wcftestclient [базовый_адрес_службы] |
Если вы воспользовались предложенным базовым адресом, то строка должна выглядеть так:
1 | wcftestclient http://localhost:8080/bookservice |
Нажмите "Enter". Запуститься тестовый клиент, в течение нескольких секунд он будет считывать данные и формировать свой интерфейс.
Потом он отобразит все множество конечных точек службы, которые работают с одним контрактом "IWorkBook". У точек будет одинаковый набор операций, так как контракт для них один и тот же. Проверьте работу клиента с разными конечными точками, отметьте для себя, что все изменения, которые производятся через одну точку, доступны и через другие точки.
5. Добавление точки обмена метаданными через конфигурационный файл
Для работы с другими WCF-приложениями иногда необходимо создать конечную точку, которая обрабатывает запросы на метаданные через привязку "mexHttpBinding". Создадим такую точку. В самом начале этой работы мы уже включали эту конечную точку таким кодом:
1 2 | host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), new Uri("http://localhost:8080/bookservice/mex")); |
Но теперь добавим эту точку через конфигурационный файл. Откройте интерфейс добавления новой конечной точки. В первом окне при выборе контракта нажмите "Обзор" ("Browse") в появившемся окне выберите глобальный кэш сборок GAC.
В списке пространств имен выберите "System.ServiceModel", а в нем контракт - "IMetadataExchange". Далее способ коммуникации – "HTTP". Метод взаимодействия "Basic". Адрес: "mex". Нажмите , и редактор откроет настройки только что созданной конечной точки.
Однако для этой точки необходимо будет изменить параметры привязки: значение атрибута "Binding" смените на "mexHttpBinding". Сохраните конфигурацию и закройте редактор. Конечная точка для публикации метаданных готова.
Откройте файл "App.config". Он должен выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="NewBehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="NewBehavior" name="b_FirstService.WorkBook"> <clear /> <endpoint address="basic" binding="basicHttpBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="advanced" binding="ws2007HttpBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="net.tcp://localhost:9000/bookservice" binding="netTcpBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="net.pipe://localhost/bookservice" binding="netNamedPipeBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://localhost:8080/bookservice" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration> |
Обратите внимание на строки, отмеченные полужирным. Именно они были созданы нами в процессе работы с редактором конфигурации. В принципе, вы можете повторять эти строки для любых своих служб напрямую в файле app.config, и служба будет поддерживать публикацию метаданных.
В следующей статье рассматривается размещение службы таким образом, чтобы клиенты могли работать с ней по локальной сети или в интернете: Основы разработки WCF-служб. Часть 9. WCF-службы в локальной сети и интернете.