Как использовать несколько служб WCF от одного клиента

StackOverflow https://stackoverflow.com/questions/686112

  •  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>

У вас просто конфликт конечных точек?Убедитесь, что обе службы не настроены, например, на прослушивание одного и того же номера порта.Если бы вы могли опубликовать свой файл конфигурации (или его очищенную версию), это помогло бы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top