Wie kann ich das 2 Verbindungslimit in WebClient programmgesteuert entfernen

Diese “feinen” RFCs verlangen von jedem RFC-Client, dass sie nicht mehr als 2 Verbindungen pro Host verwenden.

Microsoft hat dies im WebClient implementiert. Ich weiß, dass es ausgeschaltet werden kann

App.config:

        

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

Aber wie kann ich das programmatisch machen?

Gemäß http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

“Die Änderung der DefaultConnectionLimit-Eigenschaft hat keine Auswirkungen auf vorhandene ServicePoint-Objekte; sie betrifft nur ServicePoint-Objekte, die nach der Änderung initialisiert werden. Wenn der Wert dieser Eigenschaft weder direkt noch über die Konfiguration festgelegt wurde, wird standardmäßig die Konstante DefaultPersistentConnectionLimit verwendet.”

Ich möchte am besten das Limit konfigurieren, wenn ich den WebClient installiere, aber es wäre auch in Ordnung, diese traurige Einschränkung programmatisch zu Beginn meines Programms zu entfernen.

Der Server, auf den ich zugreife, ist kein normaler Webserver im Internet, sondern unter meiner Kontrolle und im lokalen LAN. Ich möchte API-Aufrufe durchführen, verwende aber keine Webservices oder Remoting

Mit einigen Tipps von hier und anderswo habe ich das in meiner Anwendung behoben, indem ich die WebClient-class überschrieben habe, die ich benutzt habe:

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

Für Interessierte:

System.Net.ServicePointManager.DefaultConnectionLimit = x (wobei x die gewünschte Anzahl von Verbindungen ist)

keine Notwendigkeit für zusätzliche Referenzen

Stellen Sie sicher, dass dies aufgerufen wird, bevor der Servicepunkt erstellt wird, wie oben im Beitrag erwähnt.

Mit dieser Lösung können Sie das Verbindungslimit jederzeit ändern:

 private static void ConfigureServicePoint(Uri uri) { var servicePoint = ServicePointManager.FindServicePoint(uri); // Increase the number of TCP connections from the default (2) servicePoint.ConnectionLimit = 40; } 

Wenn dieser FindServicePoint zum ersten Mal aufgerufen wird , wird eine ServicePoint- Instanz erstellt, und eine WeakReference wird erstellt, um sie im ServicePointManager zu halten. Nachfolgende Anforderungen an den Manager für dieselbe Uri geben dieselbe Instanz zurück. Wenn die Verbindung danach nicht verwendet wird, bereinigt der GC sie.

Wenn Sie feststellen, dass das ServicePoint-Objekt von Ihrem WebClient verwendet wird, können Sie das Verbindungslimit ändern. HttpWebRequest-Objekte verfügen über einen Zugriffsmechanismus, um den zu verwenden, für den sie erstellt wurden, so dass Sie es auf diese Weise tun können. Wenn Sie Glück haben, können alle Ihre Anfragen den gleichen ServicePoint teilen, sodass Sie ihn nur einmal ausführen müssen.

Ich kenne keinen globalen Weg, um das Limit zu ändern. Wenn Sie das DefaultConnectionLimit bei der Ausführung zu früh geändert haben, würden Sie wahrscheinlich in Ordnung sein.

Alternativ könntest du nur mit dem Verbindungslimit leben, da die meisten Server-Software dich sowieso abschalten wird. 🙂

Wir haben eine Situation in Bezug auf die obige 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 Obige nutzlos.