views:

2703

answers:

3

We use BigIP to load balance between our two IIS servers. We recently deployed a WCF service hosted on by IIS 6 onto these two Windows Server 2003R2 servers.

Each server is configured with two host headers: one for the load balancer address, and then a second host header that points only to that server. That way we can reference a specific server in the load balanced group for debugging.

So when we run We immediately got the error:

This collection already contains an address with scheme http. There can be at most one address per scheme in this collection. Parameter name: item

I did some research and we can implement a filter to tell it to ignore the one of the hosts, but then we cannot access the server from that address.

<serviceHostingEnvironment>
    <baseAddressPrefixFilters>
        <add prefix="http://domain.com:80"/&gt;
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

What is the best solution in this scenario which would allow us to hit a WCF service via http://domain.com/service.svc and http://server1.domain.com/service.svc?

If we should create our own ServiceFactory as some sites suggest, does anyone have any sample code on this?

Any help is much appreciated.

EDIT: We will need to be able to access the WCF service from either of the two addresses, if at all possible.

Thank you.

A: 

The URL it uses is based on the bindings in IIS. Does the website have more than one binding? If it does, or is the WCF service used by multiple sites? If it is, then you are SOL AFAIK. We ran into this issue. Basically, there can be only one IIS binding for HTTP, otherwise it bombs.

Also, here's info on implementing a ServiceHostFactory. That WILL work if it's possible that your WCF service only be accessible through 1 address (unfortunately for us, this was not possible).

Darren Kopp
Yes it has more the one binding as I said, "Each server is configured with two host headers: one for the load balancer address, and then a second host header that points only to that server."Both of which use the HTTP protocol.
Jason Stevenson
A: 

When you need to test a specific machine, you could "bypass" the load balancing and ensure the correct host-header is sent to keeep WCF happy by editing the "hosts" file on the machine you're testing from so, for example:

10.0.0.11 through 10.0.0.16 are the six hosts that are in the cluster "cluster.mycompany.local", with a load balanced IP address of 10.0.0.10. When testing you could add a line to the machines hosts file that says "10.0.0.13 cluster.mycompany.local" to be able to hit the third machine in the cluster directly.

Rob
Yeah, I'm beginning to think that the host headers way just won't work with WCF. If I don't get any other responses, I will accept this.
Jason Stevenson
+1  A: 

On your bigIP Create 2 new virtual servers http://server1.domain.com/ http://server2.domain.com/

create a pool for each VS with only the specific server in it - so there will be no actual load balancing and access it that way. If you are short on external IP'S you can still use the same IP as your production domain name and just use an irule to direct traffic to the appropriate pool

Hope this helps

UndertheFold