Diese "feinen" RFCs verlangen von jedem RFC-Client, dass sie nicht mehr als 2 Verbindungen pro Host verwenden ...
Microsoft hat dies in WebClient implementiert. Ich weiß, dass es mit ausgeschaltet werden kann
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>
(gefunden unter http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )
Aber wie kann ich das programmgesteuert machen?
Gemäß http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"Das Ändern der DefaultConnectionLimit-Eigenschaft hat keine Auswirkungen auf vorhandene ServicePoint-Objekte. Es betrifft nur ServicePoint-Objekte, die nach der Änderung initialisiert werden. Wenn der Wert dieser Eigenschaft weder direkt noch durch Konfiguration festgelegt wurde, wird standardmäßig die Konstante DefaultPersistentConnectionLimit festgelegt."
Ich möchte das Limit am besten konfigurieren, wenn ich den WebClient instanziiere, aber es wäre auch in Ordnung, diese traurige Einschränkung zu Beginn meines Programms programmgesteuert zu entfernen.
Der Server, auf den ich zugreife, ist kein regulärer Webserver im Internet, sondern unter meiner Kontrolle und im lokalen LAN. Ich möchte API-Aufrufe durchführen, verwende jedoch keine Webservices oder Remoting
Antworten:
Mit einigen Tipps von hier und anderswo konnte ich dies in meiner Anwendung beheben, indem ich die von mir verwendete WebClient-Klasse überschrieb:
quelle
System.Net.ServicePointManager.DefaultConnectionLimit
eine bessere Lösung ist, da nicht angenommen werden kann, dass das einWebRequest
istHttpWebRequest
, z. B. könnte es ein seinFileRequest
.für Interessierte:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(wobei x Ihre gewünschte Anzahl von Verbindungen ist)Keine zusätzlichen Referenzen erforderlich
Stellen Sie einfach sicher, dass dies aufgerufen wird, BEVOR der Servicepunkt wie oben im Beitrag erwähnt erstellt wird.
quelle
Mit dieser Lösung können Sie das Verbindungslimit jederzeit ändern :
Wenn jemand FindServicePoint zum ersten Mal aufruft , wird eine ServicePoint- Instanz erstellt und eine WeakReference erstellt, um sie im ServicePointManager beizubehalten . Nachfolgende Anforderungen an den Manager für denselben Uri geben dieselbe Instanz zurück. Wenn die Verbindung danach nicht mehr verwendet wird, bereinigt der GC sie.
quelle
ServicePoint
ist verloren (zusammen mit Ihren Einstellungen) nachMaxIdleTime
Wenn Sie das von Ihrem WebClient verwendete ServicePoint-Objekt finden, können Sie dessen Verbindungslimit ändern. HttpWebRequest-Objekte verfügen über einen Accessor zum Abrufen des Objekts, für das sie erstellt wurden. Sie können dies also auf diese Weise tun. Wenn Sie Glück haben, teilen sich alle Ihre Anfragen möglicherweise denselben ServicePoint, sodass Sie dies nur einmal tun müssen.
Ich kenne keinen globalen Weg, um das Limit zu ändern. Wenn Sie das DefaultConnectionLimit früh genug in der Ausführung geändert haben, ist dies wahrscheinlich in Ordnung.
Alternativ könnten Sie einfach mit dem Verbindungslimit leben, da die meisten Server-Software Sie sowieso drosseln wird. :) :)
quelle
Wir haben eine Situation bezüglich der obigen Konfiguration in App.Config
Damit dies in einer CONSOLE-Anwendung gültig ist, haben wir die System.Configuration-Referenz-DLL hinzugefügt. Ohne den Hinweis war das oben Genannte nutzlos.
quelle