Como: usar o moniker de serviço do Windows Communication Foundation sem registro

Para se conectar e se comunicar com um serviço WCF (Windows Communication Foundation), um aplicativo cliente WCF precisa ter os detalhes do endereço de serviço, da configuração de associação e do contrato de serviço.

O moniker de serviço do WCF normalmente obtém o contrato necessário por meio do registro anterior dos tipos de atributo necessários, mas pode haver casos em que isso não é viável. No lugar do registro, o moniker pode obter a definição do contrato na forma de um documento WSDL (Linguagem de Definição de Serviços Web), por meio do uso do parâmetro wsdl ou do Metadata Exchange, usando o parâmetro mexAddress.

Isso permite cenários como a distribuição de uma planilha do Excel em que alguns dos valores de célula são calculados por meio de interações de serviço Web. Nesse cenário, talvez não seja viável registrar o assembly do contrato de serviço em todos os clientes que possam abrir o documento. O parâmetro wsdl ou mexAddress habilita uma solução independente.

Observação

A autenticação mútua precisa ser usada para proteger contra violação de solicitação e resposta ou falsificação. Especificamente, é importante que os clientes tenham certeza de que o ponto de extremidade do Metadata Exchange que está respondendo é a parte confiável pretendida.

Exemplo

Este exemplo mostra o uso do moniker de serviço com um contrato MEX. Um serviço com o contrato a seguir é exposto com um wsHttpBinding.

using System.ServiceModel;  
  
// ...
  
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Demo")]  
public interface IAffiliate  
{  
    [OperationContract]  
    bool NewAffiliate(string ID, string company, string fullname, string accountsCode);  
    [OperationContract]  
    bool RemoveAffiliate(string ID);  
    [OperationContract]  
    double RevenueCheckMonthly(ref string ID);  
    [OperationContract]  
    double RevenueCheckTotal(ref string ID);  
}  

Para construir um cliente WCF para o serviço remoto, a cadeia de caracteres de moniker de exemplo a seguir pode ser usada.

service4:mexAddress="http://servername/Affiliates/service.svc/mex",  
address="http://servername/Affiliates/service.svc",  
contract=IAffiliate, contractNamespace=http://Microsoft.ServiceModel.Demo,  
binding=WSHttpBinding_IAffiliate, bindingNamespace=http://tempuri.org/  

Durante a execução do aplicativo cliente, o cliente executa um WS-MetadataExchange com o mexAddress fornecido. Isso pode retornar os detalhes de endereço, associação e contrato para vários serviços. Os parâmetros address, contract, contractNamespace, binding e bindingNamespace são usados para identificar o serviço pretendido. Depois que esses parâmetros tiverem correspondência, o moniker construirá um cliente WCF com a definição de contrato apropriada e as chamadas poderão ser feitas usando o cliente WCF, como com o contrato tipado.

Observação

Se o moniker estiver malformado ou se o serviço não estiver disponível, a chamada para GetObject retornará um erro dizendo "Sintaxe inválida". Se você receber esse erro, verifique se o moniker que você está usando está correto e se o serviço está disponível.

Confira também