Laden...

WebRequest Probleme bei mehreren Parallelen Anfragen ?! Bug ?

Letzter Beitrag vor 12 Jahren 6 Posts 1.656 Views
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

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

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

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.

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

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.