2009-03-26 2 views
5

Я все еще изучаю всю работу WCF, поэтому, пожалуйста, несите меня здесь.Как использовать несколько WCF-сервисов от одного клиента

У меня есть две самообслуживаемые службы, созданные с использованием C# и VS 2008:
Служба № 1 Добавляет два номера и возвращает результат.
Служба № 2 Возвращает квадрат числа.

Я хочу, чтобы клиент мог отправить два номера в Service 1, получить сумму, а затем отправить сумму на Service 2 и получить квадрат.

У меня есть два сгенерированных прокси для обеих служб, и я могу использовать Intellisense на них, так что часть якобы работает.

Теперь как настроить файл app.config таким образом, чтобы я мог общаться с обеими службами? Прямо сейчас я получаю исключение каждый раз, когда я пытаюсь это сделать.

[клиент работает нормально, если у меня есть только одна из конфигураций в файл приложения в то время, и попытаться вызвать только этот сервер.]

Я полагаю, что это очень noobish вопрос и ответ вероятно, «структурирует конфигурационный файл _____ образом», но у Google просто нет примера/руководства.

Кто-нибудь знает, как это сделать?

Примечание: Consume multiple WCF services from one client клиент Хотя звучит как дубликат, НЕ то, что я ищу.

Edit: Благодаря marc_s, я получил это работает

С и службы, работающие в различных приложениях, мне не нужно, чтобы разбить файл конфигурации сервера, но вот то, что я сделал с клиентом конфигурации файлы: Первый автоматически генерируемый конфигурационные файлы, используя SvrUtil.exe и затем объединить их таким образом:

<bindings> 
    <wsHttpBinding> 

    <binding> 
    ... 
    </binding> 

    <binding> 
    ... 
    </binding> 

    </wsHttpBinding> 
</bindings> 

...

<endpoint> 

...

+0

+1 - проголосовал врезаться вас от 1,999 до 2K повторения, так что вы можете теперь РЕДАКТИРОВАТЬ ответы других людей! Woot! –

+0

@Jeremy: Ха-ха спасибо! Невероятно, как долго он застрял в 1999 году. – Mostlyharmless

ответ

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> 

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

Марк

+0

Спасибо, это сработало! Было так много перестановок для слияния конфигурационных файлов, которые я просто решил задать, а не охватывать все перестановки: P – Mostlyharmless

0

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

+0

У меня есть оба они работают на одном порту, но я могу вызвать службу A из службы B, слушая порт 8000. Предположим, я запускаю их на разных портах, как я могу создать app.config? – Mostlyharmless

+0

В у вас будет несколько элементов и т. Д. Вы не можете просто скопировать оба полных раздела конфигурации, вы должны объединить их. –

3

Я понимаю, что вы попросили ответ 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> 
Смежные вопросы