2010-03-23 17 views
6

Tengo algunos servidores web detrás de un equilibrador de carga Amazon EC2. Estoy utilizando el equilibrio de TCP en el puerto 80 (en lugar del equilibrio HTTP).¿Cómo puedo desactivar keep-alive en las solicitudes de cliente del servicio web ASP.NET?

Tengo un cliente que consulta un servicio web (que se ejecuta en todos los servidores web) para obtener nuevos elementos cada pocos segundos. Sin embargo, el cliente parece estar conectado a un servidor y sondea el mismo servidor cada vez.

He intentado usar ServicePointManager para desactivar KeepAlive, pero eso no ha cambiado nada. La conexión saliente todavía tenía su encabezado HTTP "connection: keep-alive" y el servidor mantuvo abierta la conexión TCP. También intenté agregar una anulación de GetWebRequest a la clase proxy creada por VS, que hereda de SoapHttpClientProtocol, pero todavía veo el encabezado keep-alive.

Si cancelo el proceso del cliente y reinicio, se conectará a un nuevo servidor a través del equilibrador de carga, pero continuará sondeando ese nuevo servidor para siempre.

¿Hay alguna manera de forzarlo a conectarse a un servidor aleatorio cada vez? Quiero que la carga del único cliente se extienda a todos los servidores web.

El cliente está escrito en C# (como es el servidor) y utiliza una referencia web (no una referencia de servicio), que apunta al equilibrador de carga.

Respuesta

9

no es reemplazar el GetWebRequest método de trabajo:

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

Eh, mi intento de anular GetWebRequest no funcionó, la anulación sería llamado, pero keep-alive seguiría siendo conseguir el sistema. ¡Simplemente copié tu método textualmente, y funcionó! No estoy seguro de lo que estaba haciendo de manera diferente, ¡pero gracias! –

+0

Tal vez pueda publicar su método para que podamos ver lo que estaba mal con él. –

+0

también podría intentar ServicePointManager.SetTcpKeepAlive (falso, 0, 0); –

Cuestiones relacionadas