Frage

Das „fein“ RFCs Mandat von jedem RFC-Client, den sie passen von nicht mehr als 2 Verbindungen pro Host mit ...

Microsoft implementiert dieses in WebClient. Ich weiß, dass es mit werden kann

ausgeschaltet

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 es programmatisch?

Accordin zu http://msdn.microsoft.com/en-us /library/system.net.servicepointmanager.defaultconnectionlimit.aspx

"die Eigenschaft DefaultConnectionLimit Änderung hat keine Auswirkungen auf bestehende Servicepoint-Objekte; es wirkt sich nur auf Servicepoint-Objekte, die sind nach der Änderung initialisiert. Wenn der Wert dieser Eigenschaft ist nicht eingestellt, entweder direkt oder durch die Konfiguration, die standardmäßig auf den Wert Konstante DefaultPersistentConnectionLimit. "

Ich möchte am besten, die Grenze zu konfigurieren, wenn ich die WebClient instanziiert, aber gerade diese traurige Einschränkung Entfernen programmatisch zu Beginn meines Programms wäre auch in Ordnung.

Der Server I Zugriff ist keine regulären Webserver im Internet, aber unter meiner Kontrolle und im lokalen LAN. Ich möchte API-Anrufe tun, aber ich weiß nicht verwenden einen Web Service oder Remote

War es hilfreich?

Lösung

Mit ein paar Tipps von hier und anderswo konnte ich dies in meiner Anwendung beheben, indem Sie den WebClient-Klasse überschreiben ich wurde mit:

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

Andere Tipps

für Interessenten:

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

keine Notwendigkeit für zusätzliche Referenzen

nur sicherstellen, dass dieser vor der Dienststelle erstellt aufgerufen wird, wie im Beitrag erwähnt oben.

Diese Lösung ermöglicht es Ihnen, das Verbindungslimit in 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;
}

Das erste Mal, dass jemand nennt dies FindServicePoint , a Servicepoint Instanz erstellt wird und ein WeakReference erstellt wird innerhalb der Servicepoint . Nachfolgende Anforderungen an den Manager für den gleichen Uri Rückkehr die gleiche Instanz. Wenn die Verbindung nicht nach verwendet wird, die GC reinigt es auf.

Wenn Sie das Servicepoint Objekt finden, indem Ihr WebClient verwendet werden, können Sie das Verbindungslimit ändern. HttpWebRequest Objekte haben einen Accessor die man abrufen sie verwenden gebaut wurden, so konnte man es auf diese Weise zu tun. Wenn Sie Glück haben, werden alle Ihre Anfragen könnten die gleiche Servicepoint am Ende teilen, so würde man es nur einmal zu tun hat.

Ich weiß nicht, jeden globalen Weg, um die Grenze zu ändern. Wenn Sie die DefaultConnectionLimit früh genug in der Ausführung verändert, dann würden Sie wahrscheinlich in Ordnung sein.

Alternativ könnten Sie einfach mit dem Verbindungslimit leben, da die meisten Server-Software, die Sie wird auf jeden Fall drosseln. :)

Wir haben eine Situation, in Bezug auf das oben Stück Konfiguration in App.Config                       

Damit dies in einer Konsole-Anwendung gültig ist, fügten wir die System.Configuration Referenz dll. Ohne die Referenz war die oben nutzlos.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top