Определите wsHttpBinding во время выполнения с помощью WCF
-
23-08-2019 - |
Вопрос
У меня есть веб-приложение, которое предоставляет веб-службы с помощью WCF и wsHttpBindings.Приложение можно разместить на разных машинах и по разным URL-адресам.Это будет означать, что расположение службы WCF будет разным для каждого.
Я создаю службу Windows, которая будет ссылаться на каждое приложение и выполнять задачу.Каждая задача должна вызывать службу в веб-приложении.Я понимаю, что все привязки настраиваются в app.config, но есть ли более простой способ динамического вызова службы или как мне структурировать app.config?
<webApplication WebServiceUrl="http://location1.com/LunarChartRestService.svc" />
<webApplication WebServiceUrl="http://location2.com/LunarChartRestService.svc"/>
Решение
Файл конфигурации вашего клиента может выглядеть примерно так:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint name="Endpoint1"
address="http://location1.com/LunarChartRestService.svc"
binding="wsHttpBinding"
contract="(whatever-your-contract-is)" />
<endpoint name="Endpoint2"
address="http://location2.com/LunarChartRestService.svc"
binding="wsHttpBinding"
contract="(whatever-your-contract-is)" />
<endpoint name="Endpoint3"
address="http://location3.com/LunarChartRestService.svc"
binding="wsHttpBinding"
contract="(whatever-your-contract-is)" />
</client>
</system.serviceModel>
</configuration>
Затем в коде вы можете создать такую конечную точку (клиентский прокси-сервер) на основе ее имени и, таким образом, выбрать любое местоположение, которое вам нужно.Также ничто не мешает вам создать несколько клиентских прокси!Таким образом, вы можете без проблем подключиться к нескольким конечным точкам сервера, используя несколько клиентских прокси.
В качестве альтернативы вы, конечно, также можете создать в коде экземпляры «WsHttpBinding» и «EndpointAddress» и установить необходимые свойства (если таковые имеются), а затем вызвать конструктор для клиентского прокси с этими готовыми объектами, переопределив таким образом все app.config и создайте все, что вы считаете необходимым:
EndpointAddress epa =
new EndpointAddress(new Uri("http://location1.com/LunarChartRestService.svc"));
WSHttpBinding binding = new WSHttpBinding();
Марк
Другие советы
Судя по вашему описанию, похоже, что все серверы используют один и тот же сервисный контракт.Если это так, вы вполне могли бы просто объявить несколько конечные точки в вашем web.config и выберите его во время выполнения на основе имени конечной точки.
Конечно, возможно, вы предпочитаете не иметь дело с этой частью конфигурации WCF, а просто иметь более простой список URL-адресов и покончить с этим.Это тоже вполне возможно;вам просто нужно немного больше поработать на стороне кода, чтобы создать экземпляры прокси/объектов канала на стороне клиента.