Domanda

Quelle "belle" Rfc mandato da ogni RFC-client, che si guardino di non usare più di 2 connessioni a host...

Microsoft ha implementato questo in WebClient.Lo so che può essere spento con la

App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
 <system.net> 
  <connectionManagement> 
   <add address="*" maxconnection="100" /> 
  </connectionManagement> 
 </system.net> 
</configuration> 

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

Ma come posso fare a livello di programmazione?

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

"Cambiare il DefaultConnectionLimit proprietà non ha alcun effetto sull'esistente ServicePoint oggetti;essa colpisce solo ServicePoint oggetti che sono inizializzato dopo la modifica.Se il valore di questa proprietà non è stata impostare direttamente o per il tramite di configurazione, il valore di default per la costante DefaultPersistentConnectionLimit."

Vorrei configurare al meglio il limite quando ho instanciate WebClient, ma solo la rimozione di questo triste limitazione a livello di codice all'inizio del mio programma sarebbe bene, troppo.

Il mio server di accesso non è un normale server web in internet, ma sotto il mio controllo e in rete locale (lan).Voglio fare API-chiamate, ma io non uso webservices o remoting

È stato utile?

Soluzione

Con alcuni suggerimenti da qui e altrove, sono riuscito a risolvere questo nella mia applicazione, sovrascrivendo la classe WebClient stavo usando:

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

Altri suggerimenti

per chi è interessato:

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

non sono necessarie ulteriori riferimenti

basta assicurarsi che questo è chiamato PRIMA che il servizio è stato creato il punto come detto sopra nel post.

Questa soluzione consente di modificare il limite di connessione a 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 1 ° volta che qualcuno chiama questo FindServicePoint, un ServicePoint viene creata un'istanza di e un WeakReference è stato creato per tenere su di esso all'interno del ServicePointManager.Le richieste successive al gestore per lo stesso Uri restituire la stessa istanza.Se la connessione non viene utilizzato dopo, il GC non pulisce.

Se si trova l'oggetto ServicePoint utilizzati da un WebClient, è possibile modificare il limite di connessioni.HttpWebRequest oggetti hanno una funzione di accesso per recuperare quello che sono stati costruiti per l'uso, in modo che si potrebbe fare in questo modo.Se sei fortunato, tutte le vostre richieste potrebbe finire che condividono la stessa ServicePoint quindi avresti solo una volta.

Non so di qualsiasi globali modo per modificare il limite.Se hai modificato la DefaultConnectionLimit abbastanza presto nel corso di esecuzione, si sarebbe probabilmente essere bene.

In alternativa, si può solo vivere con il limite di connessione, dal momento che la maggior parte dei server software sta andando a manetta comunque.:)

Siamo in una situazione di quanto sopra pezzo di configurazione in-App.Config

In ordine per questo, per essere validi in un'Applicazione CONSOLE, abbiamo aggiunto il Sistema.Configurazione di riferimento dll.Senza il riferimento, di cui sopra, è stato inutile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top