Практическое руководство. Публикация метаданных для службы с использованием файла конфигурацииHow to: Publish Metadata for a Service Using a Configuration File

Это один из двух инструкций, демонстрирующих публикацию метаданных для службы Windows Communication Foundation (WCF).This is one of two how-to topics that demonstrate publishing metadata for a Windows Communication Foundation (WCF) service. Существуют два способа указать, как служба должна публиковать метаданные: с помощью файла конфигурации и с помощью кода.There are two ways to specify how a service should publish metadata, using a configuration file and using code. В этом разделе показано, как публиковать метаданные для службы с помощью файла конфигурации.This topic shows how to publish metadata for a service using a configuration file.

Внимание!

В этом разделе показано, как опубликовать метаданные незащищенным образом.This topic shows how to publish metadata in an unsecure manner. Любой клиент может получить метаданные из службы.Any client can retrieve the metadata from the service. Если требуется безопасная публикация метаданных в службе, см. раздел Настраиваемая конечная точка безопасных метаданных.If you require your service to publish metadata in a secure manner, see Custom Secure Metadata Endpoint.

Дополнительные сведения о публикации метаданных в коде см. в разделе инструкции. Публикация метаданных для службы с помощью кода.For more information about publishing metadata in code, see How to: Publish Metadata for a Service Using Code. Публикация метаданных позволяет клиентам извлекать метаданные с помощью запроса WS-Transfer GET или запроса HTTP/GET, используя строку запроса ?wsdl.Publishing metadata allows clients to retrieve the metadata using a WS-Transfer GET request or an HTTP/GET request using the ?wsdl query string. Чтобы убедиться в том, что код работает, создайте базовую службу WCF.To be sure that the code is working, create a basic WCF service. Для упрощения в следующем коде представлена несложная резидентная служба.For simplicity, a basic self-hosted service is provided in the following code.

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("http://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();  
            }  
        }  
    }  
}  

Эта служба представляет собой резидентную службу, настраиваемую посредством файла конфигурации.This service is a self-hosted service, which is configured using a configuration file. Отправной точкой будет служить следующий файл конфигурации.The following configuration file serves as a starting point.

<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 с помощью файла конфигурации приложенияTo publish metadata for a WCF service using an application configuration file

  1. В файле App.config после закрывающего элемента </services>.Within the App.config file, after the closing </services> element, create a <behaviors> element.

  2. В элемент <behaviors> добавьте элемент <serviceBehaviors>.Within the <behaviors> element, add a <serviceBehaviors> element.

  3. Добавьте элемент <behavior>``<serviceBehaviors> элемента .Add a <behavior> element to the <serviceBehaviors> element and specify a value for the name attribute of the <behavior> element.

  4. Добавьте элемент <serviceMetadata> в элемент <behavior>.Add a <serviceMetadata> element to the <behavior> element. Задайте атрибуту httpGetEnabled значение true, а атрибуту policyVersion значение Policy15.Set the httpGetEnabled attribute to true and the policyVersion attribute to Policy15. httpGetEnabled позволяет службе отвечать на запросы метаданных, переданные с помощью запроса HTTP GET.httpGetEnabled allows the service to respond to metadata requests made by an HTTP GET request. policyVersion сообщает службе, что формируемые метаданные должны соответствовать спецификации WS-Policy 1.5.policyVersion tells the service to conform to WS-Policy 1.5 when generating metadata.

  5. Добавьте атрибут behaviorConfiguration элементу <service>``name, добавленного на шаге 1, как показано в следующем примере кода.Add a behaviorConfiguration attribute to the <service> element and specify the name attribute of the <behavior> element added in step 1, as shown in the following code example.

    <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>, как показано в следующем примере кода.Add one or more <endpoint> elements with the contract set to IMetadataExchange, as shown in the following code example.

    <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 одно из следующих значений:For the metadata endpoints added in the previous step, set the binding attribute to one of the following:

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

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

    • mexNamedPipeBinding для публикации по именованному каналу;mexNamedPipeBinding for named pipe publication.

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

  8. В конечных точках метаданных, добавленных на предыдущем шаге, задайте для адреса одно из следующих значений:For the metadata endpoints added in a previous step, set the address equal to:

    • пустую строку, чтобы использовать в качестве точки публикации базовый адрес ведущего приложения, если базовый адрес совпадает с привязкой метаданных;An empty string to use the host application's base address as the publication point if the base address is the same as the metadata binding.

    • относительный адрес, если ведущее приложение имеет базовый адрес;A relative address if the host application has a base address.

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

  9. Скомпилируйте и запустите консольное приложение.Build and run the console application.

  10. С помощью Internet Explorer перейдите к базовому адресу службы ( http://localhost:8001/MetadataSample в этом примере) и убедитесь, что публикация метаданных включена.Use Internet Explorer to browse to the base address of the service (http://localhost:8001/MetadataSample in this sample) and verify that the metadata publishing is turned on. В противном случае вверху страницы отображается сообщение "Публикация метаданных для этой службы в настоящее время отключена".If not, a message at the top of the resulting page displays: "Metadata publishing for this service is currently disabled."

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

  1. Чтобы настроить метаданные в службе, которая использует конечные точки по умолчанию, укажите ServiceMetadataBehavior в файле конфигурации, как показано в предыдущем примере, но не указывайте конечные точки.To configure metadata on a service that uses default endpoints, specify the ServiceMetadataBehavior in the configuration file as in the previous example, but do not specify any endpoints. Файл конфигурации будет иметь следующий вид.The configuration file would then look like this.

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

    Поскольку служба имеет ServiceMetadataBehavior со свойством httpGetEnabled, установленным в значение true, то для службы включена публикация метаданных, а поскольку конечные точки не были добавлены явно, среда выполнения добавляет конечные точки по умолчанию.Because the service has a ServiceMetadataBehavior with the httpGetEnabled set to true, the service has publishing metadata enabled, and because no endpoints were explicitly added, the runtime adds the default endpoints. Дополнительные сведения о конечных точках по умолчанию, привязках и режимах работы см. в разделах Упрощенная конфигурация и Упрощенная конфигурация служб WCF.For more information about default endpoints, bindings, and behaviors, see Simplified Configuration and Simplified Configuration for WCF Services.

ПримерExample

В следующем примере кода показана реализация базовой службы WCF и файла конфигурации, который публикует метаданные для службы.The following code example shows the implementation of a basic WCF service and the configuration file that publishes metadata for the service.

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("http://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>  

См. такжеSee also