2013-02-26 12 views
6

Per un servizio Web C# che contatta un insieme limitato di altri server, desidero creare 1 pool di connessioni HTTP per server che desidero poter contattare.È possibile il pool di connessioni HTTP?

Il concetto di base del corso:

  • Ogni piscina dovrebbe aprire alcuni collegamenti (3 connessioni?) Al suo server web remoto, e mantenere in vita tali connessioni.
  • È necessario utilizzare un tempo massimo di durata per riciclare (scollegare/ricollegare) le connessioni al server Web remoto, impedendo la disconnessione del server Web remoto prima di procedere.
  • Le connessioni non devono essere create simultaneamente ma con una piccola pausa tra le 3 connessioni in modo che il riciclo non avvenga contemporaneamente.
  • Se il server Web remoto si disconnette ancora in modo imprevisto, dovrebbe essere notato e dovremmo riconnetterci.
  • Se la riconnessione non è possibile per qualche motivo, è necessario ripetere un tentativo dopo una breve pausa.

In questo modo, quando desidero inviare un HttpWebRequest, ho connessioni pronte per l'uso, risparmiando il tempo di impostare la connessione nel momento in cui voglio usarlo.

Al momento non so se questa è anche una funzionalità predefinita di HttpWebRequest. Mi dispiace se chiedo l'ovvio. Googling per questo mi ha portato solo a domande simili per Java.

Domanda 1: esiste una cosa presente in .NET/C#?

Domanda 2: in caso contrario, c'è una risorsa su questo presente su Internet, che conosci?

Domanda 3: in caso contrario, come affrontare la costruzione di uno stesso?

+0

Correlati: [Pool di connessioni HTTP] (http://stackoverflow.com/questions/15077526/http-connection-pooling) – slugster

+0

Scusate se ho frainteso la vostra domanda, o il contesto di esso, ma non è semplicemente fatto utilizzando WebSockets/polling lungo in .NET? SignalR funzionerebbe bene. –

risposta

3

HttpWebRequest (che in sostanza significa tutte le API Http in .net) utilizza già il pool di connessioni per impostazione predefinita.

Date un'occhiata alle classi ServicePoint e ServicePointManager se è necessario gestire uno qualsiasi dei parametri del lotto di connessioni.

+0

Ho analizzato i pacchetti TCP per scoprire cosa sta succedendo. Sembra che HttpWebRequest riutilizzi una connessione se può supportare keep-alive, ma non tenta attivamente di mantenerla in vita. Manualmente (senza C#) sono riuscito a mantenere viva la connessione ad Apache inviando semplicemente un comando (non esiste un comando NOOP HTTP ?!) newline semplice "\ n" ogni 10 secondi per evitare il timeout di Apache di essere raggiunto, ma non Penso che questo sia un modo ufficiale per farlo. Avrei potuto anche fare una richiesta HEAD, che dovrebbe anche mantenere viva la connessione, ma richiede Keep-Alive e genera più traffico –

+0

Quello che mi piacerebbe vedere è C# mantenere la connessione attiva attivamente (proprio come quello che ero in grado di fare manualmente). E dopo che si disconnette per qualsiasi motivo (Timeout raggiunto, KeepAliveTimout raggiunto, MaxKeepAliveRequests raggiunto), C# si ricollegherà direttamente e non aspetterà fino a quando non voglio utilizzare nuovamente la connessione. –

+0

Ow e BTW. Sono stato in grado di vedere che HttpWebRequest utilizza sempre lo stesso ServicePoint quando può. E lo ha confermato con httpWebRequest.ServicePoint.GetHashCode().Ma anche se la connessione è disconnessa, prima di fare una nuova richiesta, C# si riconnette tranquillamente e restituisce lo stesso codice hash. Quindi ServicePoint e hashcode rimangono gli stessi, ma è una nuova connessione, che purtroppo è stata stabilita solo quando si tenta di utilizzare. –