Como: configurar uma associação personalizada do WS-Metadata Exchange
Este artigo explica como configurar uma associação de WS-Metadata Exchange personalizada. O Windows Communication Foundation (WCF) inclui quatro associações de metadados definidas pelo sistema, mas você pode publicar metadados usando qualquer associação que quiser. Este artigo mostra como publicar metadados usando o wsHttpBinding
. Essa associação oferece a opção de expor metadados de maneira segura. O código neste artigo é baseado na Introdução.
Usar um arquivo de configuração
No arquivo de configuração do serviço, adicione um comportamento de serviço que contenha a marca
serviceMetadata
:<behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors>
Adicione um atributo
behaviorConfiguration
à marca de serviço que faz referência a esse novo comportamento:<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior" />
Adicione um ponto de extremidade de metadados especificando o mex como o endereço,
wsHttpBinding
como a associação e IMetadataExchange como o contrato:<endpoint address="mex" binding="wsHttpBinding" contract="IMetadataExchange" />
Para verificar se o ponto de extremidade de troca de metadados está funcionando corretamente, adicione uma marca de ponto de extremidade no arquivo de configuração do cliente:
<endpoint name="MyMexEndpoint" address="http://localhost:8000/servicemodelsamples/service/mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
No método Main() do cliente, crie uma nova instância MetadataExchangeClient, defina sua propriedade ResolveMetadataReferences como
true
, chame GetMetadata e, em seguida, itere por meio da coleção de metadados retornados: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());
Configurando por código
Crie uma instância de associação WSHttpBinding:
WSHttpBinding binding = new WSHttpBinding();
Crie uma instância de ServiceHost:
ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);
Adicione um ponto de extremidade de serviço e adicione uma instância ServiceMetadataBehavior:
serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, baseAddress); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb);
Adicione um ponto de extremidade de troca de metadados, especificando o WSHttpBinding criado anteriormente:
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, mexAddress);
Para verificar se o ponto de extremidade de troca de metadados está funcionando corretamente, adicione uma marca de ponto de extremidade no arquivo de configuração do cliente:
<endpoint name="MyMexEndpoint" address="http://localhost:8000/servicemodelsamples/service/mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
No método Main() do cliente, crie uma nova instância MetadataExchangeClient, defina a propriedade ResolveMetadataReferences como
true
, chame GetMetadata e, em seguida, itere por meio da coleção de metadados retornados: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());