Практическое руководство. Настройка пользовательской привязки для обмена WS-Metadata
В этой статье объясняется, как настроить настраиваемую привязку обмена метаданными WS. 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="http://localhost:8000/servicemodelsamples/service/mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как
true
, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:string mexAddress = "http://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="http://localhost:8000/servicemodelsamples/service/mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как
true
, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:string mexAddress = "http://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());