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

Ces “bonnes” RFC demandent à chaque client RFC de ne pas utiliser plus de 2 connexions par hôte …

Microsoft l’a implémenté dans WebClient. Je sais qu’il peut être désactivé avec

App.config:

        

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

Mais comment puis-je le faire par programmation?

Accédez à 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 objects ServicePoint existants; elle affecte uniquement les objects ServicePoint qui sont initialisés après la modification. Si la valeur de cette propriété n’a pas été définie directement ou via la configuration, sa valeur par défaut est DefaultPersistentConnectionLimit.”

J’aimerais mieux configurer la limite lorsque j’installe le WebClient, mais supprimer simplement cette limitation sortingste par programmation au début de mon programme serait également acceptable.

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

Avec quelques conseils d’ici et d’ailleurs, j’ai réussi à résoudre ce problème dans mon application en remplaçant 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; } } 

pour les intéressés:

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 cela s’appelle AVANT que le sharepoint service soit créé comme mentionné ci-dessus dans l’article.

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 ce FindServicePoint , une instance de ServicePoint est créée et un WeakReference est créé pour le conserver dans ServicePointManager . Les demandes ultérieures au gestionnaire pour le même Uri renvoient la même instance. Si la connexion n’est pas utilisée après, le CP le nettoie.

Si vous trouvez que l’object ServicePoint est utilisé par votre WebClient, vous pouvez modifier sa limite de connexion. Les objects HttpWebRequest ont un accesseur pour récupérer celui qu’ils ont été construits afin de pouvoir le faire de cette façon. Si vous êtes chanceux, toutes vos demandes pourraient finir par partager le même ServicePoint. Il vous suffirait donc de le faire une seule fois.

Je ne connais aucun moyen global de modifier la limite. Si vous modifiez assez tôt DefaultConnectionLimit dans l’exécution, vous vous en sortirez probablement bien.

Alternativement, vous pourriez simplement vivre avec la limite de connexion, puisque la plupart des logiciels de serveur vont vous limiter. 🙂

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

Pour que cela soit valide 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.