Come posso rimuovere a livello di codice il limite di 2 connessioni in WebClient

Queste RFC “fini” impongono a tutti i clienti RFC di stare attenti a non utilizzare più di 2 connessioni per host …

Microsoft l’ha implementato in WebClient. So che può essere distriggersto con

App.config:

        

(disponibile su http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )

Ma come posso farlo a livello di programmazione?

Accordo a http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

“La modifica della proprietà DefaultConnectionLimit non ha alcun effetto sugli oggetti ServicePoint esistenti, ma riguarda solo gli oggetti ServicePoint inizializzati dopo la modifica.Se il valore di questa proprietà non è stato impostato direttamente o tramite la configurazione, il valore predefinito è costante DefaultPersistentConnectionLimit.”

Mi piacerebbe meglio configurare il limite quando instardo il WebClient, ma rimuovere semplicemente questa triste limitazione al livello di programmazione all’inizio del mio programma andrebbe bene.

Il server che accedo non è un normale server web in internet, ma sotto il mio controllo e nella lan locale. Voglio fare chiamate API, ma non uso webservices o servizi remoti

Con alcuni suggerimenti da qui e altrove sono riuscito a risolvere questo problema nella mia applicazione ignorando la class WebClient che stavo usando:

 class AwesomeWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address); req.ServicePoint.ConnectionLimit = 10; return (WebRequest)req; } } 

per gli interessati:

System.Net.ServicePointManager.DefaultConnectionLimit = x (dove x è il numero di connessioni desiderato)

non c’è bisogno di riferimenti extra

assicuratevi che questo sia chiamato PRIMA che il punto di servizio sia creato come menzionato sopra nel post.

Questa soluzione consente di modificare il limite di connessione in qualsiasi momento :

 private static void ConfigureServicePoint(Uri uri) { var servicePoint = ServicePointManager.FindServicePoint(uri); // Increase the number of TCP connections from the default (2) servicePoint.ConnectionLimit = 40; } 

La prima volta che qualcuno chiama questo FindServicePoint , viene creata un’istanza di ServicePoint e viene creato un WeakReference per mantenerlo all’interno di ServicePointManager . Le richieste successive al gestore per lo stesso URI restituiscono la stessa istanza. Se la connessione non viene utilizzata dopo, il GC lo pulisce.

Se si trova l’object ServicePoint utilizzato dal client Web, è ansible modificare il limite di connessione. Gli oggetti HttpWebRequest dispongono di un accesso per recuperare quello che sono stati costruiti per essere utilizzati, in modo da poterlo fare in questo modo. Se sei fortunato, tutte le tue richieste potrebbero finire per condividere lo stesso ServicePoint in modo da doverlo fare solo una volta.

Non conosco alcun modo globale per modificare il limite. Se hai modificato DefaultConnectionLimit abbastanza presto nell’esecuzione, probabilmente starai bene.

In alternativa, si potrebbe semplicemente vivere con il limite di connessione, dal momento che la maggior parte del software server ti strozzerà comunque. 🙂

Abbiamo una situazione riguardante la parte di configurazione sopra riportata in App.Config

Affinché questo sia valido in un’applicazione CONSOLE, abbiamo aggiunto la dll di riferimento System.Configuration. Senza il riferimento, quanto sopra era inutile.