Практическое руководство. Публикация метаданных для службы с использованием файла конфигурации
Это одно из двух практических руководств, в которых демонстрируется публикация метаданных для службы Windows Communication Foundation (WCF). Существуют два способа указать, как служба должна публиковать метаданные: с помощью файла конфигурации и с помощью кода. В этом разделе показано, как публиковать метаданные для службы с помощью файла конфигурации.
Внимание! |
---|
В этом разделе показано, как опубликовать метаданные незащищенным образом. Любой клиент может получить метаданные из службы. Сведения о защищенной публикации метаданных службы см. в разделе Пользовательская конечная точка защищенных метаданных. |
Дополнительные сведения о публикации метаданных в коде см. в разделе Как опубликовать метаданные для службы с использованием кода. Публикация метаданных позволяет клиентам извлекать метаданные с помощью запроса 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 с помощью файла конфигурации приложения
В файле App.config после закрывающего элемента </services><behaviors> создайте элемент .
<behaviors> </behaviors>
Внутри элемента <behaviors><serviceBehaviors> добавьте элемент .
<behaviors> <serviceBehaviors> </serviceBehaviors> </behaviors>
Добавьте элемент <behavior><serviceBehaviors> в элемент name и задайте значение для атрибута <behavior> элемента .
<behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> </behavior> </serviceBehaviors> </behaviors>
Добавьте элемент <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>
Добавьте атрибут 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>
Добавьте один или несколько элементов <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>
В конечных точках метаданных, добавленных на предыдущем шаге, присвойте атрибуту binding одно из следующих значений:
mexHttpBinding для публикации по HTTP;
mexHttpsBinding для публикации по HTTPS;
mexNamedPipeBinding для публикации по именованному каналу;
mexTcpBinding для публикации по TCP.
В конечных точках метаданных, добавленных на предыдущем шаге, задайте для адреса одно из следующих значений:
пустую строку, чтобы использовать в качестве точки публикации базовый адрес ведущего приложения, если базовый адрес совпадает с привязкой метаданных;
относительный адрес, если ведущее приложение имеет базовый адрес;
абсолютный адрес.
Постройте и запустите консольное приложение.
В программе Internet Explorer перейдите по базовому адресу службы (в данном образце https://localhost:8001/MetadataSample) и убедитесь, что публикация метаданных включена. В противном случае вверху страницы отображается сообщение «Публикация метаданных для этой службы в настоящее время отключена».
Использование конечных точек по умолчанию
Чтобы настроить метаданные в службе, которая использует конечные точки по умолчанию, укажите 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 в управляемом приложении
Резидентное размещение
Как опубликовать метаданные для службы с использованием кода
Справочник
Основные понятия
Общие сведения об архитектуре метаданных
Использование метаданных