2010-03-23 12 views
6

J'ai quelques serveurs Web derrière un équilibreur de charge Amazon EC2. J'utilise l'équilibrage TCP sur le port 80 (plutôt que l'équilibrage HTTP).Comment puis-je désactiver keep-alive sur les demandes client ASP.NET Web Service?

J'ai un client interrogeant un service Web (fonctionnant sur tous les serveurs Web) pour de nouveaux éléments toutes les quelques secondes. Cependant, le client semble rester connecté à un serveur et interroge le même serveur à chaque fois.

J'ai essayé d'utiliser ServicePointManager pour désactiver KeepAlive, mais cela n'a rien changé. La connexion sortante avait toujours son en-tête HTTP "connection: keep-alive" et le serveur gardait la connexion TCP ouverte. J'ai également essayé d'ajouter une substitution de GetWebRequest à la classe proxy créée par VS, qui hérite de SoapHttpClientProtocol, mais je vois toujours l'en-tête keep-alive.

Si je tue le processus du client et le redémarre, il se connectera à un nouveau serveur via l'équilibreur de charge, mais il continuera d'interroger ce nouveau serveur pour toujours.

Existe-t-il un moyen de forcer la connexion à un serveur aléatoire à chaque fois? Je veux que la charge du client soit répartie sur tous les serveurs Web.

Le client est écrit en C# (comme le serveur) et utilise une référence Web (pas une référence de service), qui pointe vers l'équilibreur de charge.

Répondre

9

est-il ne surchargez pas le fonctionnement de la méthode GetWebRequest:

protected override WebRequest GetWebRequest(Uri uri) 
{ 
    var webRequest = (HttpWebRequest)base.GetWebRequest(uri); 
    webRequest.KeepAlive = false; 
    return webRequest; 
} 
+0

Huh, ma tentative de remplaçant GetWebRequest ne fonctionnait pas, la dérogation serait appelée, mais keep-alive serait encore se mettre. Je viens de copier votre méthode verbatim, et ça a marché! Je ne sais pas ce que je faisais différemment, mais merci! –

+0

Peut-être que vous pouvez poster votre méthode afin que nous puissions voir ce qui n'allait pas avec elle. –

+0

peut également essayer ServicePointManager.SetTcpKeepAlive (false, 0, 0); –