Como: Configurar uma vinculação personalizada do WS-Metadata Exchange
Este artigo explica como configurar uma associação de troca WS-Metadata personalizada. O Windows Communication Foundation (WCF) inclui quatro associações de metadados definidas pelo sistema, mas você pode publicar metadados usando qualquer associação desejada. Este artigo mostra como publicar metadados usando o wsHttpBinding
. Esta ligação dá-lhe a opção de expor metadados de forma segura. O código neste artigo é baseado na introdução.
Usando um arquivo de configuração
No arquivo de configuração do serviço, adicione um comportamento de serviço que contenha a
serviceMetadata
tag :<behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors>
Adicione um
behaviorConfiguration
atributo à etiqueta de serviço que faça referência a esse novo comportamento:<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior" />
Adicione um ponto de extremidade de metadados especificando mex como o endereço,
wsHttpBinding
como a vinculaçã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 MetadataExchangeClient instância, defina sua ResolveMetadataReferences propriedade como
true
, chame GetMetadata e itere através 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());
Configuração por código
Crie uma instância de WSHttpBinding vinculação:
WSHttpBinding binding = new WSHttpBinding();
Crie uma ServiceHost instância:
ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);
Adicione um ponto de extremidade de serviço e adicione uma ServiceMetadataBehavior instância:
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 MetadataExchangeClient instância, defina a ResolveMetadataReferences propriedade como
true
, chame GetMetadata e itere através 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());