Динамически задавать адрес конечной точки в клиенте wcf (с привязкой net tcp)

Так что я не слишком хорошо знаком с 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();
        }

person Jen    schedule 31.08.2012    source источник


Ответы (1)


Вы можете создать ChannelFactory.

Наряду со стандартным клиентом WCF WSDL также предоставляют класс интерфейса для клиента.

EndpointAddress address = new EndpointAddress("http://dynamic.address.here");
        using (ChannelFactory<IPartyControllerChannel> factory = new ChannelFactory<IPartyControllerChannel>("IPartyControllerEndpoint", address))
        {

            using (IPartyControllerChannel channel = factory.CreateChannel())
            {
                channel.GetLatestPartyProfile(context, parsedParameters.PartyId);
            }
        }
person Brad    schedule 31.08.2012
comment
Я собираюсь отметить ваш ответ как ответ... и обновить свой вопрос с помощью синтаксиса, который я использовал. Я не видел конструктора CreateChannel, который принимал строку и адрес конечной точки в качестве параметров, но мне удалось его исключить. Спасибо, что указали мне правильное направление :) - person Jen; 31.08.2012
comment
Ха, спасибо, я обновил свой код. Я поставил инициализацию адреса не в том месте. :( Вы также можете передать EndpointAddress в функцию создания канала. - person Brad; 31.08.2012