Laden...

WebRequest Probleme bei mehreren Parallelen Anfragen ?! Bug ?

Erstellt von MrDigi vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.637 Views
M
MrDigi Themenstarter:in
9 Beiträge seit 2007
vor 12 Jahren
WebRequest Probleme bei mehreren Parallelen Anfragen ?! Bug ?

Hallo Community,

ich habe ein merkwürdiges Problem, auch schon gegoogled und gelesen aber nichts wirklich ähnliches gefunden:

Ich führe beim Starten meiner C# (.Net 2.0) Applikation mehrere WebRequests hintereinander durch. Die Verbindungen bleiben dann über die Laufzeit des Programms geöffnet. Eigentlich wirklich nichts außergewöhnliches:


private void StartRequest() {
//...
request = (HttpWebRequest)WebRequest.Create(url);
//...
IAsyncResult result = request.BeginGetResponse(HttpResponseCallback, state);
}


private void HttpResponseCallback(IAsyncResult asyncResult)
{
  RequestState state = (RequestState)asyncResult.AsyncState;
  Log("ResponseCallback executed");
  //...
}


Die TCP-Daten werden alle **ordnungsgemäß **an den Server gesendet und auch beantwortet (mit WireShark und Netzwerkablaufverfolgung http://msdn.microsoft.com/de-de/library/ty48b824%28v=vs.80%29.aspx geprüft).

Komischerweise wird aber **nicht **bei allen Antworten der Callback HttpResponseCallback aufgerufen:
Bei 3 Requests wird bei maximal 2 auch HttpResponseCallback aufgefufen. Die anderen Verbindungen bleiben einfach "in der Luft" hängen, obwohl halt definitiv Daten ankommen.

Hatte erst DefaultConnectionLimit vom ServicePoint Manager im Verdacht, das war es aber nicht.

Sind irgendwem Bugs in der WebRequest-Klasse bekannt oder hat jemand gute Ideen was ich ändern/debuggen könnte ?

Eine Lösung hier ist zwischen den einzelnen BeginGetResponse()-Anfragen ein sleep(1000) einzubauen, dann funktioniert es. Aber das ist mehr als Pfui.

Hoffe ein hier sind ein paar Spezies die vielleicht schon einmal ähnliche Probleme hatten.

Grüße
MrDigi

W
872 Beiträge seit 2005
vor 12 Jahren

Benutzt Du ein oder mehrere WebRequest-Objekte?
Ich denke, dass ein WebRequest-Objekt nicht funktioniert.

M
MrDigi Themenstarter:in
9 Beiträge seit 2007
vor 12 Jahren

Hallo weismat,

danke für Deine Antwort.

Ich benutze für jeden Request ein Objekt. In meinem Codebeispiel ist das in StartRequest ja bereits zu sehen.

Die Requests sind in Klassen gekapselt und sind programmtechnisch komplett unabhängig voneinander.

Wenn ich den Request der "hängt" mit Abort() abbreche und nochmal neu starte funktioniert auch das Aufrufen des Callbacks.

Ideen ?

Grüße
MrDigi

16.835 Beiträge seit 2008
vor 12 Jahren

Dann solltest Du besser mit mehreren, vollständig gekapselten Objekten arbeiten.
Macht ja keinen Sinn, ein Objekt für mehrere Requests zu nutzen. Dass das Vorhaben zudem Thread-sicher ist, kann ich mir nicht vorstellen.

M
MrDigi Themenstarter:in
9 Beiträge seit 2007
vor 12 Jahren

Hi,

@Abt:

Danke für die Antwort...aber 😃

Die Requests sind in Klassen gekapselt und sind programmtechnisch komplett unabhängig voneinander.

Nichts für ungut, vielleicht habe ich mich falsch ausgedrückt. Die Requests sind komplett unabhängig voneinander, die Instanzen der WebRequest-Klassen werden auch nur einmal benutzt (was anderes geht glaube ich gar nicht).

Dass das Vorhaben zudem Thread-sicher ist, kann ich mir nicht vorstellen.

Ich kann nicht ganz nachvollziehen was bei

request.BeginGetResponse(HttpResponseCallback, state);

nicht Thread-Safe sein soll.

Grüße
MrDigi

W
872 Beiträge seit 2005
vor 12 Jahren

Du musst natuerlich synchronisieren, dass BeginGetResponse nicht mehrfach aufgerufen wird, bevor der jeweilige CallBack aufgerufen wird.
Entweder durch EndGetResponse oder dass im Callback der naechste BeginGetResponse erfolgt.
Ich persoenlich finde Parallel.ForEach mit synchroner Verwendung von WebRequest bedeutend einfacher, ausserdem wird dann automatisch optimiert, wieviele Aufrufe parallel erfolgen.