2010-03-23 11 views
6

Ho alcuni server Web dietro un sistema di bilanciamento del carico Amazon EC2. Sto usando il bilanciamento TCP sulla porta 80 (anziché il bilanciamento HTTP).Come posso disabilitare keep-alive sulle richieste del client di servizio Web ASP.NET?

Ho un client che esegue il polling di un servizio Web (in esecuzione su tutti i server Web) per nuovi elementi ogni pochi secondi. Tuttavia, il client sembra rimanere connesso a un server e esegue il polling dello stesso server ogni volta.

Ho provato a usare ServicePointManager per disabilitare KeepAlive, ma questo non ha cambiato nulla. La connessione in uscita aveva ancora l'intestazione HTTP "connessione: keep-alive" e il server manteneva aperta la connessione TCP. Ho anche provato ad aggiungere un override di GetWebRequest alla classe proxy creata da VS, che eredita da SoapHttpClientProtocol, ma continuo a vedere l'intestazione keep-alive.

Se si interrompe il processo del client e si riavvia, si collegherà a un nuovo server tramite il servizio di bilanciamento del carico, ma continuerà a interrogare il nuovo server per sempre.

C'è un modo per forzare la connessione a un server casuale ogni volta? Voglio che il carico da un client venga distribuito su tutti i server web.

Il client è scritto in C# (come il server) e utilizza un riferimento Web (non un riferimento di servizio), che punta al bilanciamento del carico.

risposta

9

non è prevalente il GetWebRequest metodo di lavoro:

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

Eh, il mio tentativo di sovrascrivendo GetWebRequest non ha funzionato, l'override sarebbe chiamato, ma keep-alive sarebbe ancora get set. Ho appena copiato il tuo metodo alla lettera e ha funzionato! Non sono sicuro di cosa stavo facendo in modo diverso, ma grazie! –

+0

Forse puoi pubblicare il tuo metodo in modo che possiamo dare un'occhiata a cosa c'è di sbagliato in esso. –

+0

potrebbe anche provare ServicePointManager.SetTcpKeepAlive (false, 0, 0); –

Problemi correlati