views:

483

answers:

1

I have a few web servers behind an Amazon EC2 load balancer. I'm using TCP balancing on port 80 (rather than HTTP balancing).

I have a client polling a Web Service (running on all web servers) for new items every few seconds. However, the client seems to stay connected to one server and polls that same server each time.

I've tried using ServicePointManager to disable KeepAlive, but that didn't change anything. The outgoing connection still had its "connection: keep-alive" HTTP header, and the server kept the TCP connection open. I've also tried adding an override of GetWebRequest to the proxy class created by VS, which inherits from SoapHttpClientProtocol, but I still see the keep-alive header.

If I kill the client's process and restart, it'll connect to a new server via the load balancer, but it'll continue polling that new server forever.

Is there a way to force it to connect to a random server each time? I want the load from the one client to be spread across all of the web servers.

The client is written in C# (as is the server) and uses a Web Reference (not a Service Reference), which points to the load balancer.

+2  A: 

Isn't overriding the CreateRequest method working:

protected override WebRequest GetWebRequest(Uri uri)
{
    var webRequest = (HttpWebRequest)base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    return webRequest;
}
Darin Dimitrov
Huh, my attempt at overriding GetWebRequest didn't work, the override would be called, but keep-alive would still get set. I just copied your method verbatim, and it worked! Not sure what I was doing differently, but thanks!
Matthew Brindley
Maybe you can post your method so that we can take a look at what was wrong with it.
Darin Dimitrov