Definir dinamicamente o endereço do terminal no cliente wcf (com ligação net tcp)
Então eu não estou muito familiarizado com o WCF e todas as coisas que eu pesquisei não me ajudaram a conseguir o que eu preciso. Desculpe se essa é uma pergunta boba :)
Basicamente, há um aplicativo de servidor com serviços expostos com o WCF (net tcp binding). Eu escrevi um novo aplicativo de console e preciso chamar o serviço. Então eu posso conseguir isso adicionando uma dll para o projeto de proxy que temos e adicionando um monte de arquivos de configuração (como WCFClientBindings, WCFClientEndPoints). Se eu usar um ponto final definido, então eu posso chamar o código assim:
using (var partyProxy = new PartyControllerProxy())
{
// execute server method
partyProfile = partyProxy.GetLatestPartyProfile(context, parsedParameters.PartyId);
}
No entanto, o aplicativo deve poder chamar o nome do host que é passado como um argumento de linha de comando.
Então, enquanto meu aplicativo funciona com um endpoint definido:
<client>
<endpoint
name="IPartyControllerEndpoint"
address="net.tcp://localhost:46000/ServiceInterface/PartyController.svc"
binding="customBinding" bindingConfiguration="DefaultNetTcpBindingConfiguration"
contract="CompanyA.Service.Product.Core.Contracts.IPartyController"
behaviorConfiguration="DefaultEndpointBehavior">
</endpoint>
</client>
Eu preciso ser capaz de atualizar o nome do host localhost para ser potencialmente algo mais. Estou esperando que a segurança não me engane :)
Os exemplos que vi parecem instanciar o cliente / proxy passando a ligação e o endereço "dinâmicos", mas nossa classe de proxy não os aceita. Existe uma maneira de atualizar o endereço do nó de extremidade (em tempo de execução) antes de chamar a classe "proxy"? Os únicos outros exemplos que vi envolveram instanciar um novo ServiceHost - mas isso não parece muito apropriado para o cliente :)
Obrigado!
Editar - OK, aqui está a sintaxe que parece funcionar bem. É um pouco diferente da resposta que aceitei, mas essa abordagem foi o caminho a seguir :)
using (ChannelFactory<IPartyController> factory = new ChannelFactory<IPartyController>("IPartyControllerEndpoint"))
{
EndpointAddress address = new EndpointAddress(String.Format("net.tcp://{0}/ServiceInterface/PartyController.svc", parsedParameters.HostName));
IPartyController channel = factory.CreateChannel(address);
partyProfile = channel.GetLatestPartyProfile(context, parsedParameters.PartyId);
((IClientChannel)channel).Close();
}