2

タブレット ベースの HTML クライアント用の Delphi ベースの Windows サーバーを作成しています。

Web サーバーに期待されるように、ほとんどのファイルは未処理で提供されますが、少数の特別なキーワードは、サーバー上の他のソフトウェアとやり取りする特別なコマンドとして解釈されます。

ほとんどの場合、すべて問題ありません。しかし、その後、一見ランダムにアクセス違反が発生し、GET パラメータの 1 つを取得しようとしているときに発生します。

これは私を怒らせたので、すべてを関数にカプセル化し、TIdHTTPRequestInfoデータ (ここではクラス内のパブリック プロパティRequestとして示されています) の存在をテストし始めました。

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

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

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

2 つの Assigned() チェックのいずれかがトリガーされるとは実際には予想していませんでしたが、ランダムに 2 番目のチェックがトリガーされ、「WHERE IS REQUEST PARAMS?」と表示されます。F5 キーを押した後、ログ ファイルに記録されます (ゆっくりとサーバーを叩いているわけではありません)。

ブロック内にブレークポイントを設定し、そのポイントに達したときに Request の値を調べると、TIdHTTPRequestInfo 構造全体がデフォルトの空のデータで満たされます。ブラウザをチェックして、送信されたリクエストを確認すると、それは私が期待するものです...(通常、「/details?id=222」のリクエストのみ)。

私は Windows 7 64 ビットで開発していることに注意してください。そのため、このようなことが原因であることに常に不安を感じています。64ビットの奇抜さが原因であることが判明した障害に何度も遭遇しました。

追加情報: Indy 9、Delphi 2007。

うまくいけば、これは理解するのに十分明確でした. 十分な情報を提供できていないため、特定の回答を探しているわけではありません。ここからどこへ行くべきかについての提案を探しています。とても有難い!:)

4

1 に答える 1

2

RequestInfo.Paramsはコンストラクターで作成され、デストラクタにはFreeAndNil()があるため、リクエストが解放されると、Assigned()はこのプロパティで失敗します。

それを考えると、シナリオの混乱した情報に基づいて、まだNILされていないが、Paramsプロパティがされている、ぶら下がっているRequestインスタンスを参照しているスレッドの問題があると思います。運が良ければうまくいくこともあれば、AVを吹き飛ばすこともあります。

または、コード内で.Paramsプロパティを手動でNILします。おそらく、このTStringListオブジェクトを渡していて、他の何かが誤ってそれを解放しているのでしょう。リクエストが完了するまで、インディはこれを解放しません。

十分な情報を提供していないので、質問はおそらく閉じられるはずなので、すべて、あなたは正しいです。

于 2011-08-15T15:35:11.207 に答える