Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это один из двух разделов, демонстрирующих публикацию метаданных для службы 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("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>
<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>
добавьте элемент<serviceBehaviors>
.Добавьте элемент
<behavior>
<serviceBehaviors> в элементname
<serviceBehaviors>
и задайте значение для атрибута <behavior><behavior>
элемента .Добавьте элемент
<serviceMetadata>
в элемент<behavior>
. Задайте атрибутуhttpGetEnabled
значениеtrue
, а атрибутуpolicyVersion
значение Policy15.httpGetEnabled
позволяет службе отвечать на запросы метаданных, переданные с помощью запроса HTTP GET.policyVersion
сообщает службе, что формируемые метаданные должны соответствовать спецификации WS-Policy 1.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>
Добавьте один или несколько элементов
<endpoint>
IMetadataExchange с контрактом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.
В конечных точках метаданных, добавленных на предыдущем шаге, задайте для адреса одно из следующих значений:
пустую строку, чтобы использовать в качестве точки публикации базовый адрес ведущего приложения, если базовый адрес совпадает с привязкой метаданных;
относительный адрес, если ведущее приложение имеет базовый адрес;
абсолютный адрес.
Создайте и запустите консольное приложение.
Перейдите к базовому адресу службы (
http://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("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>