Как использовать несколько служб WCF от одного клиента
-
22-08-2019 - |
Вопрос
Я все еще изучаю все, что связано с WCF, поэтому, пожалуйста, будьте терпеливы.
У меня есть две самостоятельные службы, созданные с использованием C# и VS 2008:
Сервис №1 Складывает два числа и возвращает результат.
Сервис №2 Возвращает квадрат числа.
Я хочу, чтобы клиент мог отправить два числа в Службу 1, получить сумму, а затем отправить сумму в Службу 2 и получить квадрат.
У меня есть два сгенерированных прокси для обеих служб, и я могу использовать на них Intellisense, так что эта часть предположительно работает.
Как теперь настроить файл app.config, чтобы я мог взаимодействовать с обеими службами?Прямо сейчас я получаю исключение каждый раз, когда пытаюсь это сделать.
[Клиент работает нормально, если у меня одновременно есть только одна конфигурация в файле приложения и я пытаюсь вызвать только этот сервер.]
Я полагаю, что это очень нубский вопрос, и ответ, вероятно, будет «структурировать файл конфигурации _____ способом», но у Google просто нет примера/руководства.
Кто-нибудь знает, как это сделать?
Примечание: Использование нескольких служб WCF от одного клиентаклиент Хотя звучит как дубликат, это НЕ то, что я ищу.
Редактировать: Спасибо marc_s, у меня все заработало
Поскольку обе службы работают в разных приложениях, мне не нужно было разделять файл конфигурации сервера, но вот что я сделал с файлами конфигурации клиента:Сначала автоматически сгенерировали файлы конфигурации с помощью SvrUtil.exe, а затем объединили их следующим образом:
<bindings>
<wsHttpBinding>
<binding>
...
</binding>
<binding>
...
</binding>
</wsHttpBinding>
</bindings>
...
<endpoint>
...
Решение
Если вы хотите запустить две службы на разных конечных точках/портах, сделайте что-то вроде этого:
Серверная часть:
<service name="Service1">
<endpoint address="http://localhost:8001/service1.asmx"
binding="basicHttpBinding"
contract="IService1" />
</service>
<service name="Service2">
<endpoint address="http://localhost:8002/service2.asmx"
binding="basicHttpBinding"
contract="IService2" />
</service>
Сторона клиента:
<client>
<endpoint address="http://localhost:8001/service1.asmx"
binding="basicHttpBinding"
contract="IService1"
name="Service1" />
<endpoint address="http://localhost:8002/service2.asmx"
binding="basicHttpBinding"
contract="IService2"
name="Service2" />
</client>
Это должно дать вам две отдельные конечные точки на сервере и клиент, который будет общаться с обеими.
Марк
Другие советы
Я понимаю, что вы просили ответ App.Config, но думаю, это может помочь.Обычно я сначала начинаю с настройки клиентских подключений программно, поскольку это проще, и как только вы это заработаете, вы можете переместить его в свой App.Config.
Вот пример настройки клиента WCF.
BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress(serverURL);
MyServiceClient myServiceProxy = new MyServiceClient(binding, address);
Тогда в вашем App.Config вы можете иметь что-то вроде приведенного ниже.
<client>
<endpoint address="http://localhost/service1.asmx"
binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding"
contract="IService1"
name="Service1" />
<endpoint address="http://localhost/service2.asmx"
binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding"
contract="IService2"
name="Service2" />
</client>
У вас просто конфликт конечных точек?Убедитесь, что обе службы не настроены, например, на прослушивание одного и того же номера порта.Если бы вы могли опубликовать свой файл конфигурации (или его очищенную версию), это помогло бы.