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

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

Это важно

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

Пример основан на руководстве по началу работы, которое реализует ICalculator контракт службы. В этом примере клиентом является консольное приложение (.exe), а служба хостится с помощью Internet Information Services (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, установив для этого значение HttpsGetEnabledtrue. Для этого требуется базовый адрес 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. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

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

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