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.