wake-up-neo.com

Wie kann ich das 2-Verbindungslimit in WebClient programmgesteuert entfernen?

Diese "feinen" RFCs verlangen von jedem RFC-Client, dass er nicht mehr als 2 Verbindungen pro Host verwendet ...

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 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

"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 über die Konfiguration festgelegt wurde, wird standardmäßig die Konstante DefaultPersistentConnectionLimit verwendet."

Ich würde das Limit am liebsten konfigurieren, wenn ich den WebClient instanziiere, aber es wäre auch in Ordnung, dieses traurige Limit 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 ausführen, verwende jedoch keine Webservices oder Remoting

87
Christian

Mit ein paar Tipps von hier und anderswo konnte ich dies in meiner Anwendung beheben, indem ich die von mir verwendete WebClient-Klasse überschrieb:

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

für interessierte:

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

keine zusätzlichen Referenzen erforderlich

stellen Sie einfach sicher, dass dies aufgerufen wird, BEVOR der Servicepunkt wie oben in der Post erwähnt erstellt wird.

119
lilmoe

Mit dieser Lösung können Sie das Verbindungslimit jederzeit um ä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 jemand diese FindServicePoint -Instanz zum ersten Mal aufruft, wird eine ServicePoint -Instanz erstellt und eine WeakReference -Instanz, um sie innerhalb der ServicePointManager . Nachfolgende Anforderungen an den Manager für denselben Uri geben dieselbe Instanz zurück. Wenn die Verbindung danach nicht verwendet wird, räumt der GC sie auf.

6
George Tsiokos

Wenn Sie feststellen, dass das ServicePoint-Objekt von Ihrem WebClient verwendet wird, können Sie dessen Verbindungslimit ändern. HttpWebRequest-Objekte verfügen über einen Accessor zum Abrufen des Objekts, für das sie erstellt wurden, sodass Sie dies auf diese Weise tun können. Wenn Sie Glück haben, teilen sich möglicherweise alle Ihre Anfragen 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önnen Sie einfach mit dem Verbindungslimit leben, da die meisten Server-Software Sie sowieso drosseln werden. :)

5
Katelyn Gadd

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.

4
Teo-Kostas