2 Stimmen

Indy IdHTTPServer GET Antwort-Parameter fehlen zufällig

Ich schreibe einen Delphi-basierten Windows-Server für einen Tablet-basierten HTML-Client.

Die meisten Dateien werden unverarbeitet bereitgestellt, wie es von einem Webserver zu erwarten ist, aber einige spezielle Schlüsselwörter werden als besondere Befehle interpretiert, die mit anderer Software auf dem Server interagieren.

Meistens läuft alles gut. Aber dann, scheinbar zufällig, erhalte ich eine Zugriffsverletzung, und das beim Versuch, einen der GET-Parameter abzurufen.

Das hat mich verrückt gemacht, also habe ich das gesamte Ding in eine Funktion eingekapselt und begonnen, auf die Existenz der TIdHTTPRequestInfo-Daten zu prüfen (hier als öffentliche Eigenschaft Request innerhalb der Klasse dargestellt):

function TELSCommand.GETValue(key:AnsiString):AnsiString;
begin
    if not Assigned(Request) then begin
        Log.e('WO IST DER REQUEST?');
        Result := '';
        Exit;
    end;

    if not Assigned(Request.Params) then begin
        Log.e('WO SIND DIE REQUEST PARAMS?');
        Result := '';
        Exit;
    end;

    if (Request.Params.IndexOfName(key) >= 0) then
        Result := Request.Params.Values[key]
    else
        Result := '';

Ich hatte eigentlich nicht erwartet, dass einer der beiden Assigned()-Checks ausgelöst wird, aber zufällig wird der zweite ausgelöst, und ich sehe "WO SIND DIE REQUEST PARAMS?" in meiner Protokolldatei, nachdem ich F5 gedrückt habe (langsam, ich hämmere nicht auf den Server).

Wenn ich einen Haltepunkt innerhalb des Blocks setze und den Wert von Request überprüfe, wenn es diesen Punkt erreicht, ist die gesamte TIdHTTPRequestInfo-Struktur mit Standard- und leeren Daten gefüllt. Wenn ich den Browser überprüfe, um zu sehen, welche Anfrage gesendet wurde, ist es das, was ich erwarte... (generell nur eine Anfrage nach "/details?id=222", zum Beispiel).

Ich sollte erwähnen, dass ich unter Windows 7 64-Bit entwickle, daher bin ich ständig paranoid, dass solche Dinge davon verursacht werden. Mehr als einmal bin ich auf Hindernisse gestoßen, die sich als 64-Bit-Kuriositäten herausstellten.

Zusätzliche Informationen: Indy 9, Delphi 2007.

Hoffentlich war das klar genug zu verstehen. Ich suche keine konkreten Antworten, da ich bei weitem nicht genug Informationen bereitgestellt habe; ich suche nur nach Vorschlägen, wohin ich als nächstes gehen soll. Vielen Dank! :)

2voto

Darian Miller Punkte 7580

RequestInfo.Params wird im Konstruktor erstellt und es gibt ein FreeAndNil() im Destruktor, sodass das Assigned() fehlschlägt, sobald die Anfrage freigegeben wird.

Angesichts dessen und basierend auf den verwirrenden Informationen zu Ihrem Szenario nehme ich an, dass Sie einige Thread-Probleme haben, bei denen Sie auf eine schwebende Anforderungsinstanz verweisen, die noch nicht NIL-frei ist, aber die Params-Eigenschaft bereits ist. Manchmal haben Sie Glück und es funktioniert, manchmal tritt ein AV auf.

Alternativ setzen Sie die .Params-Eigenschaft irgendwie manuell in Ihrem Code auf NIL. Möglicherweise geben Sie dieses TStringList-Objekt weiter und etwas anderes gibt es versehentlich frei. Indy wird dies erst freigeben, wenn die Anfrage abgeschlossen ist.

Alles in allem haben Sie recht, da Sie nicht genügend Informationen bereitgestellt haben und die Frage wahrscheinlich geschlossen werden sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X