Search code examples
c#.netwcfwcf-client

How to consume multiple WCF services from one client


I am still learning the whole WCF thing, so please bear with me here.

What I have is two self hosted services created using C# and VS 2008:
Service # 1 Adds two numbers and returns the result.
Service # 2 Returns the square of a number.

I want the client to be able to send in two numbers to Service 1, get the sum and then send the sum in to Service 2 and get the square.

I have two generated proxies for both the services, and I am able to use Intellisense on them, so that part supposedly works.

Now how do i configure my app.config file such that I can communicate with both the services? Right now, i get an exception every time I try to do that.

[The client works fine if I only have one of the configurations in the app file at a time, and try to call only that server.]

I suppose this is a very noobish question, and the answer probably is "structure the config file in _____ manner", but Google simply does not seem to have an example/guide.

Anyone know how to do this?

Note: Consume multiple WCF services from one client client Though sounds like a duplicate is NOT what I am looking for.

Edit: Thanks to marc_s, I got it working

With both the services running in different apps, I did not need to split the server config file, but here is what I did with the client config files: First auto-generated the config files using SvrUtil.exe and then merged them in this way:

<bindings>
  <wsHttpBinding>

    <binding>
    ...
    </binding>

    <binding>
    ...
    </binding>

  </wsHttpBinding>
</bindings>

...

  <endpoint>

...


Solution

  • If you want to run the two services on separate endpoints / ports, do something like this:

    Server-side:

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

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

    That should give you two separate, individual endpoints on the server and a client that will talk to both.

    Marc