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


Практическое руководство. Публикация метаданных для службы с использованием файла конфигурации

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

ms734765.Caution(ru-ru,VS.100).gifВнимание!
В этом разделе показано, как опубликовать метаданные незащищенным образом. Любой клиент может получить метаданные из службы. Сведения о защищенной публикации метаданных службы см. в разделе Пользовательская конечная точка защищенных метаданных.

Дополнительные сведения о публикации метаданных в коде см. в разделе Как опубликовать метаданные для службы с использованием кода. Публикация метаданных позволяет клиентам извлекать метаданные с помощью запроса WS-Transfer GET или запроса HTTP/GET, используя строку запроса ?wsdl. Чтобы убедиться в работоспособности кода, создайте простую службу WCF. Для упрощения в следующем коде представлена несложная резидентная служба.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(SimpleService),
                new Uri("https://localhost:8001/MetadataSample")); 
            try
            {
                // Open the service host to accept incoming calls
                host.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                host.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}

Эта служба представляет собой резидентную службу, настраиваемую посредством файла конфигурации. Отправной точкой будет служить следующий файл конфигурации.

<configuration>
  <system.serviceModel>
    <services>
      <service name="Metadata.Example.SimpleService">
        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="Metadata.Example.ISimpleService" />
      </service>
    </services>
    <behaviors>
      
    </behaviors>
  </system.serviceModel>
</configuration>

Публикация метаданных для службы WCF с помощью файла конфигурации приложения

  1. В файле App.config после закрывающего элемента </services><behaviors> создайте элемент .

    <behaviors>
    
    </behaviors>
    
  2. Внутри элемента <behaviors><serviceBehaviors> добавьте элемент .

    <behaviors>
      <serviceBehaviors>
    
      </serviceBehaviors>
    </behaviors>
    
  3. Добавьте элемент <behavior><serviceBehaviors> в элемент name и задайте значение для атрибута <behavior> элемента .

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
    
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  4. Добавьте элемент <serviceMetadata><behavior> в элемент . Присвойте атрибуту httpGetEnabled значение true, а атрибуту policyVersion значение "Policy15". Атрибут httpGetEnabled позволяет службе отвечать на запросы метаданных, переданные с помощью запроса HTTP GET. Атрибут policyVersion сообщает службе, что формируемые метаданные должны соответствовать спецификации WS-Policy 1.5.

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  5. Добавьте атрибут behaviorConfiguration элементу <service>name и задайте атрибут <behavior> элемента , добавленного на шаге 1, как показано в следующем примере кода.

    <services>
      <service
          name="Metadata.Example.SimpleService"
          behaviorConfiguration="SimpleServiceBehavior">
        ...
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  6. Добавьте один или несколько элементов <endpoint>IMetadataExchange с контрактом , как показано в следующем примере кода.

    <services>
      <service
          name="Metadata.Example.SimpleService"
          behaviorConfiguration="SimpleServiceBehavior">
    
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Metadata.Example.ISimpleService" />
    
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    
  7. В конечных точках метаданных, добавленных на предыдущем шаге, присвойте атрибуту binding одно из следующих значений:

    • mexHttpBinding для публикации по HTTP;

    • mexHttpsBinding для публикации по HTTPS;

    • mexNamedPipeBinding для публикации по именованному каналу;

    • mexTcpBinding для публикации по TCP.

  8. В конечных точках метаданных, добавленных на предыдущем шаге, задайте для адреса одно из следующих значений:

    • пустую строку, чтобы использовать в качестве точки публикации базовый адрес ведущего приложения, если базовый адрес совпадает с привязкой метаданных;

    • относительный адрес, если ведущее приложение имеет базовый адрес;

    • абсолютный адрес.

  9. Постройте и запустите консольное приложение.

  10. В программе Internet Explorer перейдите по базовому адресу службы (в данном образце https://localhost:8001/MetadataSample) и убедитесь, что публикация метаданных включена. В противном случае вверху страницы отображается сообщение «Публикация метаданных для этой службы в настоящее время отключена».

Использование конечных точек по умолчанию

  1. Чтобы настроить метаданные в службе, которая использует конечные точки по умолчанию, укажите ServiceMetadataBehavior в файле конфигурации, как показано в предыдущем примере, но не указывайте конечные точки. Файл конфигурации будет иметь следующий вид.

    <configuration>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="SimpleServiceBehavior">
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
      </system.serviceModel>
    </configuration>
    

    Поскольку служба имеет ServiceMetadataBehavior со свойством httpGetEnabled, установленным в значение true, то в ней включена публикация метаданных, а поскольку конечные точки не добавлены явно, то среда выполнения добавляет конечные точки по умолчанию. Дополнительные сведения о конечных точках по умолчанию, привязках и поведениях см. в разделах Упрощенная конфигурация и Упрощенная конфигурация служб WCF.

Пример

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

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(SimpleService),
                new Uri("https://localhost:8001/MetadataSample")); 
            try
            {
                // Open the service host to accept incoming calls
                host.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                host.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

См. также

Задачи

Как разместить службу WCF в управляемом приложении
Резидентное размещение
Как опубликовать метаданные для службы с использованием кода

Справочник

ServiceMetadataBehavior

Основные понятия

Общие сведения об архитектуре метаданных
Использование метаданных