2

我正在为基于平板电脑的 HTML 客户端编写基于 Delphi 的 Windows 服务器。

大多数文件都是未经处理的,就像您对 Web 服务器的期望一样,但少数特殊关键字被解释为与服务器上其他软件交互的特殊命令。

大多数时候,一切都很好。但随后,似乎是随机的,我会遇到访问冲突,这将是在尝试检索其中一个 GET 参数时。

这让我发疯,所以我将整个事情封装到一个函数中,然后开始测试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;

我实际上没想到会触发两个 Assigned() 检查中的任何一个,但是,随机地,第二个会被触发,我会看到“请求参数在哪里?” 按 F5 后在我的日志文件中(慢慢地,我没有敲击服务器)。

当我在块内抛出一个断点并在到达该点时检查 Request 的值时,整个TIdHTTPRequestInfo 结构都填充了默认的空数据。如果我检查浏览器以查看它发送的请求,这就是我所期望的……(例如,通常只是对“ /details?id=222 ”的请求)。

我应该注意到我正在 Windows 7 64 位上进行开发,所以我一直对由它引起的这种事情感到偏执。我不止一次遇到了问题,结果证明是因为 64 位的古怪。

附加信息:印地 9,德尔福 2007。

希望这足够清楚,可以理解。我不是在寻找具体的答案,因为我提供的还不够;我只是在寻找关于从这里去哪里的建议。非常感激!:)

4

1 回答 1

2

RequestInfo.Params 在构造函数中创建,并且在析构函数中有一个 FreeAndNil(),因此一旦请求被释放,Assigned() 将在此属性上失败。

鉴于此,并根据您的场景的混淆信息,我假设您有一些线程问题,您正在引用尚未 NIL 的悬空请求实例,但 Params 属性已经存在。有时你很幸运并且它有效,有时它会炸毁一个 AV。

或者,您在代码中以某种方式手动对 .Params 属性进行 NIL。也许您正在传递这个 TStringList 对象,而其他东西意外地释放了它。在请求完成之前,Indy 不会释放它。

总而言之,您是正确的,因为您没有提供足够的信息,问题可能应该被关闭。

于 2011-08-15T15:35:11.207 回答