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

Я все еще изучаю 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>

...


person Mostlyharmless    schedule 26.03.2009    source источник
comment
+1 - проголосовали за то, чтобы поднять вашу репутацию с 1999 до 2000, так что теперь вы можете РЕДАКТИРОВАТЬ ответы других людей! ух!   -  person Robin Rodricks    schedule 07.11.2009
comment
@ Джереми: Ха-ха, спасибо! Невероятно, как долго он застрял в 1999 году.   -  person Mostlyharmless    schedule 08.11.2009


Ответы (3)


Если вы хотите запустить две службы на разных конечных точках / портах, сделайте что-то вроде этого:

На стороне сервера:

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

Это должно дать вам две отдельные, индивидуальные конечные точки на сервере и клиент, который будет разговаривать с обоими.

Марк

person marc_s    schedule 26.03.2009
comment
Спасибо, сработало! Было так много перестановок для слияния файлов конфигурации, что я просто решил спросить, а не охватывать все перестановки: P - person Mostlyharmless; 01.04.2009

Я понимаю, что вы запросили ответ 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>
person sipsorcery    schedule 26.03.2009

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

person David M    schedule 26.03.2009
comment
У меня они оба работают на одном порте, но я могу вызвать службу A из службы B, обе слушают порт 8000. Предположим, я запускаю их на разных портах, как мне структурировать app.config? - person Mostlyharmless; 26.03.2009
comment
В ‹system.serviceMode› ‹services› у вас будет несколько элементов ‹service› и так далее. Вы не можете просто скопировать оба полных раздела конфигурации, вы должны их объединить. - person David M; 26.03.2009