2009-07-13 12 views
27

Mam interfejs API oparty na HTTP, który potencjalnie muszę wywoływać wiele razy. Problem polega na tym, że nie mogę poprosić o zrobienie mniej niż około 20 sekund, chociaż ta sama prośba za pośrednictwem przeglądarki jest niemal natychmiastowa. Poniższy kod ilustruje sposób, w jaki zaimplementowałem go do tej pory.Jak wykonać szybkie żądanie WWW w języku C#

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

Jednym rozwiązaniem byłoby zrobić asynchroniczne żądanie, ale chciałbym wiedzieć, dlaczego to trwa tak długo, a jeśli mogę tego uniknąć. Próbowałem również używać klasy WebClient, ale podejrzewam, że używa wewnętrznie WebRequest.

Aktualizacja:

Running następujący kod trwało około 40 sekund w trybie zwolnienia (mierzona z stoper):

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

pracuję na uczelni, gdzie mogą być różne rzeczy konfiguracja sieci wpływająca na wydajność, ale bezpośrednie użycie przeglądarki pokazuje, że powinna ona być bliska chwili.

Aktualizacja 2:

wysłał kod na zdalnym komputerze i to działało dobrze więc należy stwierdzić, że kod .NET robi coś dodatkowego w stosunku do przeglądarki lub ma problemy rozstrzygnięcia przez adres sieć uniwersytecka (problemy z proxy czy coś takiego!).

+6

W jaki sposób ustaliłeś, że jest to żądanie internetowe, które wymaga czasu? Zwykle nie mam żadnych problemów z wydajnością z klasą HttpWebRequest. Czy próbowałeś, aby aplikacja wykonywała kilka połączeń, a jeśli tak, czy wszystkie połączenia trwały tyle samo czasu? –

+1

Czy dzieje się to ze wszystkimi adresami URL, takimi jak google.com? A co z korzystaniem z adresu URL innego niż ssl? – tbreffni

+0

Tak, komentarze i sugestie Fredrika są dobre. Nie ma powodu, aby HttpWebRequest miał słabą wydajność w jakikolwiek sposób (nie mówiąc o * że * słaba) - w końcu używa tego samego protokołu co przeglądarka. – Noldorin

Odpowiedz

3

Czy Twoja witryna ma nieprawidłowy certyfikat SSL? Spróbuj dodać ten

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

Problem ten jest podobny do innego post na StackOverflow: Stackoverflow-2519655(HttpWebrequest is extremely slow)

Większość czasu problem stanowi własność serwer Proxy. Powinieneś ustawić tę właściwość na null, w przeciwnym razie obiekt podejmie próbę wyszukania odpowiedniego serwera proxy, który będzie używany przed przejściem bezpośrednio do źródła. Uwaga: ta właściwość jest domyślnie włączona, więc musisz wyraźnie powiedzieć obiektowi, aby nie wykonywał tego wyszukiwania proxy.

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

upvoting, wygląda tak samo w przypadku HttpClient –

13

miałem drugą opóźnienie na „pierwszej” 30 - próba odniesienia JamesR do drugiego słupka z podaniem ustawienia proxy NULL rozwiązać go natychmiast!

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

... 

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

Nie zamykasz swojego wniosku. Jak tylko osiągniesz liczbę dozwolonych połączeń, musisz poczekać, aż upłynie limit czasu. Wypróbuj

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