2009-07-13 2 views
27

Ich habe eine HTTP-basierte API, die ich möglicherweise mehrmals aufrufen muss. Das Problem ist, dass ich die Anforderung nicht weniger als 20 Sekunden dauern kann, obwohl die gleiche Anforderung, die über einen Browser gestellt wird, nahezu sofort ist. Der folgende Code zeigt, wie ich es bisher implementiert habe.So führen Sie eine schnelle Web-Anfrage in C#

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla"); 
var response = r.GetResponse(); 

Eine Lösung wäre eine asynchrone Anforderung zu machen, aber ich möchte wissen, warum es so lange dauert, und wenn ich es vermeiden kann. Ich habe auch versucht, die WebClient-Klasse zu verwenden, aber ich vermute, dass es intern eine WebRequest verwendet.

Update:

den folgenden Code Lauf dauerte etwa 40 Sekunden in der Release-Modus (gemessen mit Stoppuhr):

WebRequest g = HttpWebRequest.Create("http://www.google.com"); 
var response = g.GetResponse(); 

ich an einer Universität bin zu arbeiten, wo es verschiedene Dinge sein könnte in Die Netzwerkkonfiguration wirkt sich auf die Leistung aus, aber die direkte Verwendung des Browsers zeigt, dass sie fast sofort verfügbar sein sollte.

Update 2:

hochgeladen ich den Code auf einen Remote-Rechner und es funktionierte gut, so ist festzustellen, dass der .NET-Code tut etwas extra im Vergleich zum Browser oder es hat Probleme die Adresse durch Auflösen das Universitätsnetzwerk (Proxy-Probleme oder etwas ?!).

+6

Wie haben Sie festgestellt, dass es die Web-Anfrage ist, die Zeit braucht? Ich habe normalerweise keine Leistungsprobleme mit der HttpWebRequest-Klasse. Haben Sie versucht, die Anwendung mehrere Anrufe auszuführen, und wenn ja, haben alle Anrufe so viel Zeit in Anspruch genommen? –

+1

Erfolgt dies bei allen URLs wie google.com? Was ist mit der Verwendung einer Nicht-SSL-URL? – tbreffni

+0

Ja, Fredriks Kommentare und Vorschläge sind gut. Es gibt keinen Grund, dass HttpWebRequest in irgendeiner Weise schlechte Leistung (geschweige denn * das * schlecht) haben sollte - immerhin verwendet es das gleiche Protokoll wie der Browser. – Noldorin

Antwort

3

Hat Ihre Site ein ungültiges SSL-Zertifikat? Versuchen Sie, diese

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept); 

//... somewhere AlwaysAccept is defined as: 

using System.Security.Cryptography.X509Certificates; 
using System.Net.Security; 

public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 
27

Dieses Problem auf eine andere Stelle auf Stackoverflow ähnelt: Stackoverflow-2519655(HttpWebrequest is extremely slow)

Die meiste Zeit das Problem ist der Proxy-Server-Eigenschaft. Sie sollten diese Eigenschaft auf null setzen, andernfalls versucht das Objekt, nach einem geeigneten Proxy-Server zu suchen, bevor er direkt zur Quelle geht. Hinweis: Diese Eigenschaft ist standardmäßig aktiviert, sodass Sie dem Objekt explizit mitteilen müssen, dass diese Proxy-Suche nicht ausgeführt werden soll.

request.Proxy = null; 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
} 
+1

upvoting, sieht aus wie es auch für den HttpClient gilt –

13

Ich wurde am ‚ersten‘ Versuch, die 30 Sekunden Verzögerung - JamesR Verweise auf die anderen Post zu erwähnen Proxy-Einstellung es sofort auf null gelöst!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url); 
request.Proxy = null; // <-- this is the good stuff 

... 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
1

Sie schließen Ihre Anfrage nicht. Sobald Sie die Anzahl der erlaubten Verbindungen erreicht haben, müssen Sie auf die vorherigen warten, um eine Zeitüberschreitung zu erhalten. Versuchen

using (var response = g.GetResponse()) 
{ 
    // do stuff with your response 
}