Ces RFC "fines" obligent chaque client RFC à ne pas utiliser plus de 2 connexions par hôte ...
Microsoft a implémenté cela dans WebClient. Je sais qu'il peut être désactivé 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 par programme?
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; elle affecte uniquement les objets 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, la valeur par défaut est la constante DefaultPersistentConnectionLimit."
J'aimerais mieux configurer la limite lorsque j'instancie le WebClient, mais supprimer simplement cette triste limitation par programme au début de mon programme serait également très bien.
Le serveur auquel j'accède n'est pas un serveur Web régulier 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 ni de communication à distance
Réponses:
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:
la source
System.Net.ServicePointManager.DefaultConnectionLimit
est une meilleure solution, car ne peut pas supposer que leWebRequest
est unHttpWebRequest
, par exemple, il pourrait être unFileRequest
.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 est appelé AVANT que le point de service soit créé comme mentionné ci-dessus dans le message.
la source
Cette solution vous permet de modifier la limite de connexion à tout moment :
La première fois que quelqu'un appelle ce FindServicePoint , une instance ServicePoint est créée et une WeakReference est créée pour la conserver dans ServicePointManager . Les demandes suivantes adressées au gestionnaire pour le même Uri renvoient la même instance. Si la connexion n'est pas utilisée après, le CPG la nettoie.
la source
ServicePoint
est perdu (avec vos paramètres) aprèsMaxIdleTime
Si vous trouvez l'objet ServicePoint utilisé par votre WebClient, vous pouvez modifier sa limite de connexion. Les objets HttpWebRequest ont un accesseur pour récupérer celui pour lequel ils ont été construits, vous pouvez donc le faire de cette façon. Si vous avez de la chance, toutes vos demandes peuvent finir par partager le même ServicePoint, vous n'aurez donc à le faire qu'une seule fois.
Je ne connais aucun moyen global de modifier la limite. Si vous avez modifié le DefaultConnectionLimit suffisamment tôt dans l'exécution, tout ira probablement bien.
Alternativement, vous pouvez simplement vivre avec la limite de connexion, car la plupart des logiciels de serveur vont vous ralentir de toute façon. :)
la source
Nous avons une situation concernant la partie 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.
la source