Получить / изменить адрес из конфигурации клиента Endpoint - PullRequest
3 голосов
/ 24 февраля 2011

Я хотел бы сохранить конфигурации конечных точек в файле .config, но иметь возможность изменять базовый адрес во время выполнения. EG: это мои определения конечных точек в app.config:

<endpoint address="net.tcp://BASEURI:1001/FooService/"
          binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common"
          contract="ServiceContracts.MyService"
          name="FooService" />

<endpoint address="net.tcp://BASEURI:1002/BarService/"
          binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Special"
          contract="ServiceContracts.MyService"
          name="BarService" />

Каждый сервис использует один и тот же контракт (ServiceContracts.MyService), но работает на другом порту, на другом пути, а иногда и на другой конфигурации привязки.

Я хочу иметь возможность программно извлекать адрес "net.tcp: // BASEURI / FooService /", заменять "BASEURI" на адрес сервера, а затем передавать его в качестве адреса DuplexChannelFactory при подключении клиента создано. EG:

string ServiceToUse = "FooService";

var endpointConfig = SomeFunctionThatGetsTheConfig(ServiceToUse);
string trueAddress = endpointConfig.Address.Replace("BASEURI", "192.168.0.1");
DuplexChannelFactory<FooService> client = 
    new DuplexChannelFactory<FooService>(ServiceToUse, new EndpointAddress(trueAddress));

Я знаю, что клиентские конечные точки не поддерживают функцию конечных точек службы, но моя цель - как-то обойти это, чтобы мне не нужно было знать, что остальные URI или привязка.

Примечание: я не использую класс Proxy, я использую DuplexChannelFactory напрямую.

Ответы [ 2 ]

5 голосов
/ 24 февраля 2011

Вы можете сделать это довольно легко на вашей ChannelFactory, например ::

ChannelFactory<IFoo> cf = new ChannelFactory<IFoo>("EndpointConfigName");
string address = cf.Endpoint.Address.Uri.ToString();
address = address.Replace("BASEURI", "192.168.0.1");
cf.Endpoint.Address = new EndpointAddress(address);

Хорошо, у вас есть DuplexChannelFactory, но идея та же самая.

0 голосов
/ 24 февраля 2011

Реализация IEndpointBehavior и изменение URL при добавлении.

Вам необходимо изменить ServiceEndpoint в ApplyClientBehavior:

void ApplyClientBehavior(
    ServiceEndpoint endpoint,
    ClientRuntime clientRuntime
)
{
    endpoint.Address = ...
}
...