Geschwindigkeit bei WebRequests

Hallo,

ich hätte einmal eine Frage zum Webrequest in C#. Bisher mache ich das immer so:

string postData = …irgendwas…;
/////////////////////////////////////////////////////

HttpWebRequest f_HttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("…irgendwas…");
f_HttpWebRequest.Timeout = 600000;
f_HttpWebRequest.ReadWriteTimeout = 600000;
f_HttpWebRequest.ContentType = „application/x-www-form-urlencoded“;

f_HttpWebRequest.Method = „POST“;
f_HttpWebRequest.ContentLength = Encoding.Default.GetBytes(postData).Length;
using (Stream stream = f_HttpWebRequest.GetRequestStream())
{
stream.Write(Encoding.Default.GetBytes(postData), 0, Encoding.Default.GetBytes(postData).Length);
}

HttpWebResponse f_HttpWebResponse = (HttpWebResponse)f_HttpWebRequest.GetResponse();

Allerdings dauert es mit dieser Methode bei ausgelasteten Servern ziemlich lange, bis ich eine Antwort bekomme - daher auch die hohen Timeouts. Wenn ich die Seite aber manuell mit dem Browser (IE oder Firefox) aufrufe, dauert das zwar auch noch sehr lange geht aber trotzdem deutlich schneller als mit dieser Methode.
Hat jemand von euch eine Ahnung, woran das liegen könnte - sind die C# Bibliotheken nicht so gut oder muss ich meine Anfrageart ändern?

Schonmal vielen Dank für eine Antwort, viele Grüße

Manny

hoi,

ich habe mal versucht dein problem nachzuvollziehen, allerdings kann ich deinen fehler nicht reproduzieren. bei mir laufen die abfragen recht schnell (ich lasse mir aber auch nur den quelltext der seiten ausgeben).
bei welchen aktionen hängt die abfrage denn (willst du zb. große bilder parsen/laden)…?
probier doch mal die neuen versionen von den beiden klassen aus.

WebRequest /\*bzw.\*/ WebResponse

.
ansonsten würde mir auf die schnelle nur einfallen, die daten vorher zu cachen bevor du sie verarbeitest…

greetz, me

Hi,
vielen Dank für die Antwort und dafür das du es auch extra ausprobiert hast!

ich habe mal versucht dein problem nachzuvollziehen,
allerdings kann ich deinen fehler nicht reproduzieren. bei mir
laufen die abfragen recht schnell (ich lasse mir aber auch nur
den quelltext der seiten ausgeben).

Ja, das mache ich auch - allerdings geht es bei mir nicht um „normale“ Seiten - die innerhalb weniger Sekunden geladen sind.
Wir haben in der Uni ein Portal bei dem man sich für Kurse anmelden muss. Die Freischaltung erfolgt dann z.B. um 7 Uhr morgens und unzählige Studenten versuchen sich anzumelden, da die Plätze beschränkt sind. In diesem besonderen Fall dauert eine Anfrage an den Server schon so um die 1-2 Minuten (daher auch die hohen Timeouts - nicht für normale Websites, die hat er auch sofort geladen). Obwohl das Programm viel schneller reagieren kann (die Anmeldung besteht aus mehreren Websites durch die man sich durchklicken muss) und mit Hilfe von Threads sogar bis zu 10 Anmeldeanfragen parallel gestellt hat (oder hindert diese Maßnahme mehr als sie nützt?) war man mit dem Browser in der Regel trotzdem schneller mit der Anmeldung.
An sich müsste das Programm doch auch einen Vorteil gegenüber dem Browser haben, da es die Daten gar nicht groß parsen und anzeigen muss, sondern direkt zu den relevanten Stellen springen kann.

probier doch mal die neuen versionen von den beiden klassen
aus.

WebRequest /*bzw.*/ WebResponse

.

Leider ist im Moment keine Anmeldephase mehr, sodass ich im Moment nicht testen kann, da ich keine so überlastete Website sonst kenne^^

ansonsten würde mir auf die schnelle nur einfallen, die daten
vorher zu cachen bevor du sie verarbeitest…

Wie meinst du das - ich brauche doch den ganzen Code - da ich ja vorher nicht weiß an welcher Position die relevanten Informationen kommen.
Ich glaube auch nicht dass das runterladen des Codes so langsam ist (das sind ja immer nur ein paar kb) sondern es dauert einfach nur ewig bis der Server sich einem zuwendet und überhaupt was schickt. Hatte vielleicht gedacht das Firefox irgendwie die Anfrage schon anders stellt (z.B. die Daten gezippt anfordern) - sodass diese Anfrage eine höhere Priorität erreicht?

Ich habe auch mal mit dem folgenden Code versucht die Geschwindigkeit beim downloaden von richtigen Daten zu vergleichen (WebClient basiert auf der neueren Version WebRequest):

WebClient downloader = new WebClient();
 Console.WriteLine("Starte mit Download!");

 downloader.DownloadFile("http://phong.informatik.uni-leipzig.de/~kuska/update/mathandc.pdf ", "C:\\Test.pdf");
 Console.WriteLine("Fertig mit Download!");

Dabei brauchte das Programm so zwischen 12-21 Sekunden, Firefox etwa 3-8 Sekunden. Allerdings weiß ich nicht wie vergleichbar die Werte sind, da Firefox die Daten ja auch Cachen kann.

Viele Grüße

Manny

hoi manny,

ist dein problem mittlerweile gelöst? habe leider für dieses portal nicht immer zeit, deswegen auch erst jetzt meine nachfrage…

greetz, me, mhb

Hi mhb,

vielen Dank für dein Interesse!! :smile:

Ich habe versucht die Option „gezippt“ anzugeben und habe auch gezippte Daten bekommen - allerdings konnte ich dabei keinen wirklichen Geschwindigkeitsvorteil ausmachen.
Es konnte aber auch nicht auf diesen Extremfall bei der Anmeldung angewendet werden - weil der nur alle halbe Jahre (einmal pro Semester) auftritt - und das ist erst wieder im August/Oktober.

Was mir noch eingefallen ist - vielleicht geht das durchhangeln durch die Anmeldung mit Firefox schneller, weil er die Verbindung nach dem Aufruf einer Website nicht sofort schließt. Während ich die alte Verbindung immer schließe und dann für die nächste Website wieder einen neuen HttpWebRequest erstelle, kann er vielleicht auf die alte noch bestehende Verbindung zum Server aufbauen und bekommt damit schneller eine Antwort.

Warum der Download einer großen Datei schneller ist, erklärt das zwar nicht, aber vielleicht kann FireFox die Datei aufspalten und dann gleichzeitig von verschiedenen Positionen in der Datei laden, während der WebClient dieses nicht tut.

Werde im August/Oktober nochmal ein bischen wieder unter dem Extremfall testen - aber im Moment bringt es leider nichts neue Ideen zu testen, da bei normalen Servern die Website eh sofort da ist.

Viele Grüße

Manny

hoi manni,

interesse immer, nur die zeit… :smile:
das du eine verbindung jedes mal shliesst und öffnest kann natürlich bei deinem problem schwierig werden…

ff oder auch der ie haben die möglichkeit mehrere http-verbindungen gleichzeitig zu erlauben/zu bearbeiten. was dann eben u.u. auch die die dl-geschwindigkeiten steigern kann. im bereich .net würde mir nur einfallen ein feld (array) von den Web-Objekten (speziell die requests) zu erstellen und diese dann über eine art wrapperklasse (die eine art semaphore für die datenbehandlung enthält) zu managen, um diese „multi-links“ zu managen (vllt. kann man ein bissl kreativ auch hier schon mit normalen berkley-sockets arbeiten).

wir sollten uns spätestens im august nochmal mit deinem problem beschäftigen…! :smile:

greetz, me, mhb