Так что я не слишком хорошо знаком с WCF, и все, что я искал в Google, не помогло мне достичь того, что мне нужно. Извините, если это глупый вопрос :)
В основном есть серверное приложение со службами, предоставляемыми с помощью WCF (сетевая привязка tcp). Я написал новое консольное приложение, и мне нужно вызвать службу. Поэтому я могу добиться этого, добавив dll для нашего прокси-проекта и добавив кучу файлов конфигурации (таких как WCFClientBindings, WCFClientEndPoints). Если я использую определенную конечную точку, я могу вызвать такой код:
using (var partyProxy = new PartyControllerProxy())
{
// execute server method
partyProfile = partyProxy.GetLatestPartyProfile(context, parsedParameters.PartyId);
}
Однако предполагается, что приложение может вызывать имя хоста, которое передается в качестве аргумента командной строки.
Итак, пока мое приложение работает с определенной конечной точкой:
<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>
Мне нужно иметь возможность обновить имя хоста localhost, чтобы оно могло быть чем-то другим. Надеюсь, что безопасность меня не подведет :)
Примеры, которые я видел, создают экземпляр клиента/прокси, передавая «динамическую» привязку и адрес, но наш класс прокси не принимает их. Нет ли способа обновить адрес конечной точки (во время выполнения) перед вызовом класса «прокси»? Единственные другие примеры, которые я видел, включали создание нового ServiceHost, но это не очень подходит для клиента :)
Спасибо!
Редактировать. Хорошо, вот синтаксис, который работает хорошо. Это немного отличается от ответа, который я принял, но этот подход был правильным :)
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();
}