88 votes

Comment puis-je supprimer par programmation la limite de 2 connexions dans WebClient ?

Ces "bons" RFCs exigent de chaque client RFC qu'il prenne garde à ne pas utiliser plus de 2 connexions par hôte...

Microsoft l'a mis en œuvre dans WebClient. Je sais qu'il est possible de le désactiver avec

App.config :

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

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

Mais comment puis-je le faire de manière programmatique ?

Conformément à http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

"La modification de la propriété DefaultConnectionLimit n'a aucun effet sur les objets ServicePoint existants. objets ServicePoint existants ; elle n'affecte que les objets ServicePoint qui sont initialisés après la modification. Si la valeur de cette propriété n'a pas été n'a pas été définie, soit directement, soit par configuration, la valeur par défaut est la constante DefaultPersistentConnectionLimit".

Je préférerais configurer la limite lorsque j'instancie le WebClient, mais la suppression programmatique de cette triste limitation au début de mon programme serait également acceptable.

Le serveur auquel j'accède n'est pas un serveur web ordinaire sur Internet, mais sous mon contrôle et dans le réseau local. Je veux faire des appels d'API, mais je n'utilise pas de services Web ou de remoting.

120voto

lilmoe Points 611

Pour les personnes intéressées :

System.Net.ServicePointManager.DefaultConnectionLimit = x (où x est le nombre de connexions souhaité)

pas besoin de références supplémentaires

Assurez-vous simplement que cet appel est effectué AVANT la création du point de service, comme mentionné ci-dessus dans le post.

50voto

Shizam Points 4030

Grâce à quelques conseils provenant d'ici et d'ailleurs, j'ai réussi à résoudre ce problème dans mon application en surchargeant la classe WebClient que j'utilisais :

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

7voto

George Tsiokos Points 1008

Cette solution vous permet de modifier la limite de connexion à à tout moment :

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 première fois que quelqu'un appelle ça FindServicePoint , a ServicePoint est créée et une instance Référence faible est créé pour le retenir à l'intérieur de la ServicePointManager . Les demandes ultérieures adressées au gestionnaire pour le même Uri renvoient la même instance. Si la connexion n'est pas utilisée par la suite, le GC la nettoie.

5voto

Katelyn Gadd Points 662

Si vous constatez que l'objet ServicePoint est utilisé par votre WebClient, vous pouvez modifier sa limite de connexion. Les objets HttpWebRequest disposent d'un accesseur pour récupérer celui pour lequel ils ont été construits, vous pouvez donc le faire de cette manière. Si vous avez de la chance, toutes vos requêtes pourraient finir par partager le même ServicePoint et vous n'auriez à le faire qu'une seule fois.

Je ne connais pas de moyen global de modifier la limite. Si vous modifiez la DefaultConnectionLimit suffisamment tôt dans l'exécution, tout ira probablement bien.

Vous pouvez aussi vous contenter de la limite de connexion, puisque la plupart des logiciels de serveur vous étrangleront de toute façon :)

4voto

Teo-Kostas Points 31

Nous avons une situation concernant le morceau de configuration ci-dessus dans App.Config

Pour que cela soit valable dans une application CONSOLE, nous avons ajouté la dll de référence System.Configuration. Sans la référence, ce qui précède était inutile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X