Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo CustomMexEndpoint demonstra como implementar um serviço com um ponto de extremidade de metadados seguro que utiliza uma das associações que não realizam troca de metadados e como configurar a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) ou clientes para obter os metadados desse ponto de extremidade. Há duas associações fornecidas pelo sistema disponíveis para expor pontos de extremidade de metadados: mexHttpBinding e mexHttpsBinding. mexHttpBinding é usado para expor um ponto de extremidade de metadados por HTTP de maneira não segura. mexHttpsBinding é usado para expor um ponto de extremidade de metadados por HTTP de maneira segura. Este exemplo ilustra como expor um ponto de extremidade de metadados seguro usando o WSHttpBinding. Você gostaria de fazer isso quando quiser alterar as configurações de segurança na associação, mas não deseja usar HTTPS. Se você usar o mexHttpsBinding, o ponto de extremidade de metadados será seguro, mas não haverá como modificar as configurações de associação.
Observação
O procedimento de instalação e as instruções de build para este exemplo estão localizados no final deste tópico.
Serviço
O serviço neste exemplo tem dois endpoints. O ponto de extremidade do aplicativo atende ao contrato ICalculator em um WSHttpBinding com ReliableSession habilitado e segurança Message usando certificados. O ponto de extremidade de metadados também usa WSHttpBinding, com as mesmas configurações de segurança, mas sem ReliableSession. Esta é a configuração relevante:
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding2"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
<binding name="Binding2">
<reliableSession inactivityTimeout="00:01:00" enabled="true" />
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
Em muitos dos outros exemplos, o endpoint dos metadados usa o padrão mexHttpBinding, que não é seguro. Aqui, os metadados são protegidos usando WSHttpBinding com a segurança de Message. Para que os clientes de metadados recuperem esses metadados, eles devem ser configurados com uma associação correspondente. Este exemplo demonstra dois desses clientes.
O primeiro cliente usa Svcutil.exe para buscar os metadados e gerar o código e a configuração do cliente no tempo do design. Como o serviço usa uma associação não padrão para os metadados, a ferramenta Svcutil.exe deve ser configurada especificamente para que possa obter os metadados do serviço usando essa associação.
O segundo cliente usa o MetadataResolver para buscar dinamicamente os metadados de um contrato conhecido e, em seguida, invocar operações no cliente gerado dinamicamente.
Cliente Svcutil
Ao usar a associação padrão para hospedar seu IMetadataExchange ponto de extremidade, você pode executar Svcutil.exe com o endereço desse ponto de extremidade:
svcutil http://localhost/servicemodelsamples/service.svc/mex
e funciona. Mas neste exemplo, o servidor usa um ponto de extremidade não padrão para hospedar os metadados. Portanto, Svcutil.exe deve ser instruído a usar a vinculação correta. Isso pode ser feito usando um arquivo de Svcutil.exe.config.
O arquivo Svcutil.exe.config parece um arquivo de configuração de cliente normal. Os únicos aspectos incomuns são o nome do endpoint do cliente e o contrato.
<endpoint name="http"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCertificateBehavior"
contract="IMetadataExchange" />
O nome do ponto de extremidade deve ser o nome do esquema do endereço em que os metadados estão hospedados e o contrato de ponto de extremidade deve ser IMetadataExchange. Portanto, quando Svcutil.exe é executado com uma linha de comando como a seguinte:
svcutil http://localhost/servicemodelsamples/service.svc/mex
ele procura o ponto de extremidade chamado "http" e o contrato IMetadataExchange para configurar a associação e o comportamento da troca de comunicação com o ponto de extremidade de metadados. O restante do arquivo Svcutil.exe.config no exemplo especifica as credenciais de configuração e comportamento de vinculação para corresponder à configuração do servidor do endpoint de metadados.
Para que Svcutil.exe pegue a configuração no Svcutil.exe.config, Svcutil.exe deve estar no mesmo diretório que o arquivo de configuração. Como resultado, você deve copiar Svcutil.exe de seu local de instalação para o diretório que contém o arquivo Svcutil.exe.config. Em seguida, nesse diretório, execute o seguinte comando:
.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex
O ".\" à esquerda garante que a cópia de Svcutil.exe neste diretório (aquele que tem um Svcutil.exe.config correspondente) seja executada.
Cliente MetadataResolver
Se o cliente souber o contrato e como interagir com os metadados no momento de design, poderá descobrir dinamicamente a vinculação e o endereço dos pontos de extremidade do aplicativo usando o MetadataResolver. Este cliente de exemplo demonstra isso, mostrando como configurar a associação e as credenciais usadas MetadataResolver criando e configurando um MetadataExchangeClient.
As mesmas informações de associação e certificado exibidas no Svcutil.exe.config podem ser especificadas imperativamente no MetadataExchangeClient:
// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My,
X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate( StoreLocation.CurrentUser, StoreName.TrustedPeople,
X509FindType.FindBySubjectName, "localhost");
Com o mexClient configurado, podemos enumerar os contratos nos quais estamos interessados e usar MetadataResolver para buscar uma lista de pontos de extremidade com esses contratos:
// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);
Por fim, podemos usar as informações desses pontos de extremidade para inicializar a associação e o endereço de um ChannelFactory usado para criar canais para se comunicar com os pontos de extremidade do aplicativo.
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);
O ponto chave deste cliente de exemplo é demonstrar que, se você estiver usando MetadataResolver, e você deve especificar associações ou comportamentos personalizados para a comunicação de troca de metadados, você pode usar um MetadataExchangeClient para especificar essas configurações personalizadas.
Para configurar e compilar o exemplo
Verifique se você executou o Procedimento de instalação avulsa dos exemplos do Windows Communication Foundation.
Para compilar a solução, siga as instruções contidas em Como compilar as amostras do Windows Communication Foundation.
Para executar o exemplo no mesmo computador
Execute Setup.bat na pasta de instalação do exemplo. Isso instala todos os certificados necessários para executar o exemplo. Observe que Setup.bat usa a ferramenta FindPrivateKey.exe, que é instalada executando setupCertTool.bat das Amostras de Procedimento de Instalação Única para o Windows Communication Foundation.
Execute o aplicativo cliente em \MetadataResolverClient\bin ou \SvcutilClient\bin. A atividade do cliente é exibida no aplicativo de console do cliente.
Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para exemplos de WCF.
Remova os certificados executando Cleanup.bat quando terminar de usar o exemplo. Outros exemplos de segurança usam os mesmos certificados.
Para executar o exemplo entre computadores
No servidor, execute
setup.bat service. A execuçãosetup.batcom oserviceargumento cria um certificado de serviço com o nome de domínio totalmente qualificado do computador e exporta o certificado de serviço para um arquivo chamado Service.cer.No servidor, edite Web.config para refletir o novo nome do certificado. Ou seja, altere o
findValueatributo no <elemento serviceCertificate> para o nome de domínio totalmente qualificado do computador.Copie o arquivo Service.cer do diretório de serviço para o diretório do cliente no computador cliente.
No cliente, execute
setup.bat client. A execuçãosetup.batcom oclientargumento cria um certificado de cliente chamado Client.com e exporta o certificado do cliente para um arquivo chamado Client.cer.No arquivo App.config da máquina cliente
MetadataResolverClient, altere o valor do endereço do endpoint mex para corresponder ao novo endereço do serviço. Você faz isso substituindo localhost pelo nome de domínio totalmente qualificado do servidor. Altere também a ocorrência de "localhost" no arquivo metadataResolverClient.cs para o novo nome do certificado de serviço (o nome de domínio totalmente qualificado do servidor). Faça a mesma coisa para o App.config do projeto SvcutilClient.Copie o arquivo Client.cer do diretório do cliente para o diretório de serviço no servidor.
No cliente, execute
ImportServiceCert.bat. Isso importa o certificado de serviço do arquivo Service.cer para o repositório CurrentUser – TrustedPeople.No servidor, execute
ImportClientCert.bat, isso importa o certificado do cliente do arquivo Client.cer para o repositório LocalMachine – TrustedPeople.No computador de serviço, crie o projeto de serviço no Visual Studio e selecione a página de ajuda em um navegador da Web para verificar se ele está em execução.
No computador cliente, execute o MetadataResolverClient ou o SvcutilClient do VS.
- Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para exemplos de WCF.
Para limpar após a amostra
Execute Cleanup.bat na pasta de exemplos depois de concluir a execução do exemplo.
Observação
Esse script não remove certificados de serviço em um cliente ao executar este exemplo entre computadores. Se você tiver executado exemplos do Windows Communication Foundation (WCF) que usam certificados em computadores, desmarque os certificados de serviço que foram instalados no repositório CurrentUser – TrustedPeople. Para fazer isso, use o seguinte comando:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Por exemplo:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.