Поделиться через


Поведение публикации метаданных

В примере метаданных показано, как управлять функциями публикации метаданных службы. Чтобы предотвратить непреднамеренное раскрытие потенциально конфиденциальных метаданных службы, конфигурация по умолчанию для служб Windows Communication Foundation (WCF) отключает публикацию метаданных. Это поведение безопасно по умолчанию, но также означает, что вы не можете использовать средство импорта метаданных (например, Svcutil.exe) для создания клиентского кода, необходимого для вызова службы, если только в конфигурации не включено поведение публикации метаданных службы.

Внимание

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

Пример основан на начале работы, который реализует ICalculator контракт службы. В этом образце клиентом является консольное приложение (EXE), а служба размещается в службах IIS.

Примечание.

Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.

Чтобы отобразить метаданные для службы, параметр ServiceMetadataBehavior должен быть сконфигурирован в службе. При наличии такого поведения можно публиковать метаданные, конфигурируя конечную точку для предоставления контракта IMetadataExchange как реализации протокола WS-MetadataExchange (MEX). Для удобства этому контракту присвоено сокращенное имя конфигурации "IMetadataExchange". В этом образце используется привязка mexHttpBinding, являющаяся удобной стандартной привязкой, эквивалентной wsHttpBinding с режимом безопасности, которому присвоено значение None. Относительный адрес mex используется в конечной точке, которая при разрешении с базовым адресом служб приводит к адресу http://localhost/servicemodelsamples/service.svc/mexконечной точки. Ниже приводится конфигурация поведения:

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Ниже приводится описание конечной точки MEX.

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

Этот образец присваивает свойству HttpGetEnabled логическое значение true, а также предоставляет метаданные службы, используя HTTP GET. Чтобы включить конечную точку метаданных HTTP GET, службе должен быть присвоен базовый HTTP-адрес. Для доступа к метаданным используется строка запроса ?wsdl для базового адреса службы. Например, чтобы просмотреть WSDL для службы в веб-браузере, вы будете использовать адрес http://localhost/servicemodelsamples/service.svc?wsdl. Кроме того, можно использовать это поведение, чтобы предоставить метаданные по протоколу HTTPS, присваивая свойству HttpsGetEnabled логическое значение true. Это потребует наличия базового HTTPS-адреса.

Чтобы получить доступ к конечной точке MEX службы, используйте средство служебной программы метаданных ServiceModel (Svcutil.exe).

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

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

Чтобы получить доступ к метаданным службы с помощью HTTP GET, укажите браузер http://localhost/servicemodelsamples/service.svc?wsdl.

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

Если свойству HttpGetEnabled присваивается логическое значение false, будет отображена справочная страница CalculatorService вместо метаданных службы.

Настройка, сборка и выполнение образца

  1. Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.

  2. Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".