Pull to refresh

Простой пример использования WCF в Visual Studio 2010. Часть 2

Reading time5 min
Views27K
Original author: Dennis van der Stelt
Вы читаете вторую часть:

image

Предыдущая часть описывала простейший пример создания службы (service) WCF и её вызова из клиентского приложения. В этой части вы сможете узнать, как можно достичь точно такого же результата, но теперь мы будем настраивать всё вручную. Таким образом, мы переопределим (override) стандартные конечные точки, настроим наши собственные, и в итоге получим точно такое же поведение нашего приложения.

Идея заключается в том, что бы вы поняли, что делает WCF и что вы можете сделать это самостоятельно. Кроме того, предыдущие версии .NET фреймворка не поддерживают стандартные конечные точки, и это означает, что решение, которое мы получим в конце этой статьи, будет также работать и в Visual Studio 2008.

Что мы будем делать?
  1. Добавим конечные точки BasicHttpBinding
  2. Добавим конечные точки MEX
  3. Добавим поведение метаданных (Metadata behavior)

Поведение метаданных


Мы начнем сразу с третьего пункта просто потому, что здесь у нас уже почти всё готово. Решение из предыдущего поста содержало следующую конфигурацию приложения (application configuration) для приложения ConsoleHost.
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.     <system.serviceModel>
  4.         <behaviors>
  5.             <serviceBehaviors>
  6.                 <behavior>
  7.                     <serviceMetadata httpGetEnabled="True"/>
  8.                 </behavior>
  9.             </serviceBehaviors>
  10.         </behaviors>
  11.     </system.serviceModel>
  12. </configuration>
* This source code was highlighted with Source Code Highlighter.

Поведение службы не имеет названия, что делает его стандартным для всех служб в WCF4. Все, что нам нужно сделать, это задать ему имя. Измените строку 6 следующим образом:
  1. <behavior name="MyBehavior">
* This source code was highlighted with Source Code Highlighter.

Добавление конечной точки BasicHttpBinding


Теперь мы добавим первую конечную точку, используя BasicHttpBinding. Прямо под <system.serviceModel> мы добавим тег <services /> и добавим нашу службу. Оставив все значения пустыми, мы получим следующее:
  1. <services>
  2.     <service name="">
  3.         <endpoint
  4.             address=""
  5.             binding=""
  6.             contract="" />
  7.     </service>
  8. </services>
* This source code was highlighted with Source Code Highlighter.

Теперь нам нужно заполнить пробелы. Более подробную информацию можно найти в статьях о WCF ABC и размещении службы (hosting the service).
  • Name
    Это немного сбивает с толку, но вы не можете просто ввести любое имя, на самом деле это тип службы.
    Здесь мы должны указать полное имя реализации (implementation) нашей службы. То есть не интерфейса, а класса. В нашем случае имя класса EmailValidator, но его полное название включает пространство имен, что в итоге приводит к EmailService.EmailValidator.
  • Address
    Адрес мы не обязаны заполнять, потому что базовый адрес (base address) в нашем коде уже определяет его. Вы также можете определить его в конфигурации, об этом вы можете прочитать в посте об адресе.
  • Binding
    Привязка (binding) — просто basicHttpBinding. Обратите внимание на верблюжью нотацию (camelCasing).
  • Contract
    Здесь мы должны указать контракт, которым является наш интерфейс. Как и в случае с атрибутом Name, необходимо ввести полное имя, в нашем случае: EmailService.IEmailValidator.
Вы сможете увидеть итоговый результат в конце этой статьи, а также скачать решение, ссылка на которое размещена тоже в конце статьи.

Добавление конечной точки MEX


Конечная точка MEX требует настроенного поведения метаданных, но мы вернемся к этому позже. Для начала нам необходимо добавить конечную точку. Снова WCF ABC, адрес, привязка и контракт.
  • Address
    Поскольку мы не можем указать для этой конечной точки тот же адрес, что и для конечной точки BasicHttpBinding, мы введём здесь «mex».
  • Binding
    Здесь всё просто: mexHttpBinding
  • Contract
    Тут тоже всё просто, хотя и немного странно, контракт ДОЛЖЕН быть IMetadataExchange. Не полное имя или какое-нибудь другое, он просто должен быть именно таким.

Включение (enabling) поведения метаданных


Теперь нам осталось только добавить поведение метаданных. Это делается в теге объявления службы, рядом с её именем. Добавляем атрибут behaviorConfiguration и указываем имя нашей конфигурации поведения: MyBehavior.

Итоговый результат


В итоге, мы получили следующую конфигурацию:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.     <system.serviceModel>
  4.         <services>
  5.             <service name="EmailService.EmailValidator" behaviorConfiguration="MyBehavior">
  6.                 <endpoint
  7.                     address=""
  8.                     binding="basicHttpBinding"
  9.                     contract="EmailService.IEmailValidator" />
  10.                 <endpoint
  11.                     address="mex"
  12.                     binding="mexHttpBinding"
  13.                     contract="IMetadataExchange" />
  14.             </service>
  15.         </services>
  16.         <behaviors>
  17.             <serviceBehaviors>
  18.                 <behavior name="MyBehavior">
  19.                     <serviceMetadata httpGetEnabled="True"/>
  20.                 </behavior>
  21.             </serviceBehaviors>
  22.         </behaviors>
  23.     </system.serviceModel>
  24. </configuration>
* This source code was highlighted with Source Code Highlighter.

Вы можете скачать решение для Visual Studio 2010 и Visual Studio 2008 прямо здесь.
Tags:
Hubs:
+13
Comments2

Articles

Change theme settings