Как настроить пользовательскую привязку для обмена WS-Metadata
В этой теме описывается, как настроить пользовательскую привязку WS-Metadata Exchange. Windows Communication Foundation (WCF) содержит четыре определенных системой привязки метаданных, однако предусмотрена возможность публикации метаданных с помощью любой привязки. В этой теме рассказывается, как опубликовать метаданные с помощью wsHttpBinding. Эта привязка позволяет предоставлять метаданные безопасным способом. Код в этой статье основан на коде в разделе Образец для начала работы.
Использование файла конфигурации
В файле конфигурации службы добавьте поведение службы, содержащее тег serviceMetadata:
<behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors>
Добавьте в тег службы, ссылающийся на новое поведение, атрибут behaviorConfiguration:
<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
Добавьте конечную точку метаданных, указав mex в качестве адреса, wsHttpBinding как привязку и IMetadataExchange как контракт:
<endpoint address="mex" binding="wsHttpBinding" contract="IMetadataExchange" />
Чтобы проверить правильность работы конечной точки обмена метаданными, добавьте тег конечной точки в файл конфигурации клиента:
<endpoint name="MyMexEndpoint" address="https://localhost:8000/servicemodelsamples/service/mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как true, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:
string mexAddress = "https://localhost:8000/servicemodelsamples/service/mex"; MetadataExchangeClient mexClient = new MetadataExchangeClient("MyMexEndpoint"); mexClient.ResolveMetadataReferences = true; MetadataSet mdSet = mexClient.GetMetadata(new EndpointAddress(mexAddress)); foreach (MetadataSection section in mdSet.MetadataSections) Console.WriteLine("Metadata section: " + section.Dialect.ToString());
Настройка кодом
Создайте экземпляр привязки WsHttpBinding:
WSHttpBinding binding = new WSHttpBinding();
Создайте экземпляр ServiceHost:
ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);
Добавьте конечную точку службы и экземпляр ServiceMetadataBehavior:
serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, baseAddress); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb);
Добавьте конечную точку обмена метаданными, указав ранее созданную WSHttpBinding:
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, mexAddress);
Чтобы проверить правильность работы конечной точки обмена метаданными, добавьте тег конечной точки в файл конфигурации клиента:
<endpoint name="MyMexEndpoint" address="https://localhost:8000/servicemodelsamples/service/mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как true, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:
string mexAddress = "https://localhost:8000/servicemodelsamples/service/mex"; MetadataExchangeClient mexClient = new MetadataExchangeClient("MyMexEndpoint"); mexClient.ResolveMetadataReferences = true; MetadataSet mdSet = mexClient.GetMetadata(new EndpointAddress(mexAddress)); foreach (MetadataSection section in mdSet.MetadataSections) Console.WriteLine("Metadata section: " + section.Dialect.ToString());
См. также
Задачи
Поведение публикации метаданных
Извлечение метаданных
Основные понятия
Метаданные
Публикация метаданных
Публикация конечных точек метаданных