Indy IdHTTPServer GET параметры ответа случайно отсутствуют - PullRequest
2 голосов
/ 08 августа 2011

Я пишу сервер Windows на базе Delphi для HTML-клиента на основе планшета.

Большинство файлов обрабатываются необработанными, как и следовало ожидать от веб-сервера, но несколько специальных ключевых слов:интерпретируется как специальные команды, которые взаимодействуют с другим программным обеспечением на сервере.

В большинстве случаев все в порядке.Но потом, казалось бы, наугад, я получил бы нарушение доступа, и это было бы при попытке получить один из параметров GET.

Это сводило меня с ума, поэтому я заключил все это ви только что начал тестирование на наличие данных TIdHTTPRequestInfo (показанных здесь как общедоступное свойство Запрос внутри класса):

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;

Я не сделална самом деле ожидаем, что сработает любая из двух проверок Assigned (), но, случайно, вторая сработает, и я увижу "ГДЕ ПАРАМЫ ЗАПРОСА?"в моем файле журнала после нажатия F5 (медленно, я не бью сервер).

Когда я сбрасываю точку останова внутри блока и проверяю значение Request, когда оно достигает этой точки, весь * 1016Структура * TIdHTTPRequestInfo заполнена пустыми данными по умолчанию.Если я проверю браузер, чтобы увидеть, какой запрос он отправил, это то, что я ожидал ... (как правило, просто запрос для " / details? Id = 222 ", например).

Должен заметить, что я работаю на 64-битной Windows 7, так что я постоянно параноидален из-за таких вещей, как это.Я не раз сталкивался с трудностями из-за 64-битного дурачества.

Дополнительная информация: Indy 9, Delphi 2007.

Надеюсь, это было достаточно ясно, чтобы понять.Я не ищу конкретные ответы, так как я не предоставил достаточно;Я просто ищу предложения о том, куда идти отсюда.Очень признателен!:)

1 Ответ

2 голосов
/ 15 августа 2011

RequestInfo.Params создается в Конструкторе, и в Destructor есть FreeAndNil (), поэтому после того, как Запрос будет Free'd, Assigned () завершится с ошибкой для этого свойства.

Учитывая это, и основываясь на запутанной информации о вашем сценарии, я бы предположил, что у вас есть некоторые проблемы с многопоточностью, когда вы ссылаетесь на висячий экземпляр Request, который еще не NIL, но свойство Params было.Иногда вам везет, и это работает, а иногда это уносит AV.

Альтернативно, вы вручную обнуляете свойство .Params в своем коде.Возможно, вы передаете этот объект TStringList, а что-то другое освобождает его случайно.Indy не получит бесплатную поддержку до тех пор, пока запрос не будет выполнен.

В общем, вы правы, поскольку не предоставили достаточно информации, и вопрос, вероятно, следует закрыть.

...