Indy IdHTTPServer GET响应参数随机丢失

时间:2011-08-08 18:29:11

标签: web-services delphi delphi-2007 indy indy-9

我正在为基于平板电脑的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()检查中的任何一个被触发,但随机地,第二个将被触发,我会看到“请求PARAMS在哪里?”在点击F5之后在我的日志文件中(慢慢地,我没有敲击服务器)。

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

我应该注意到我正在使用64位Windows 7进行开发,所以我经常会因为它而导致这种情况偏执。我不止一次遇到因为64位狡猾而陷入困境的障碍。

其他信息:Indy 9,Delphi 2007。

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

1 个答案:

答案 0 :(得分:2)

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

考虑到这一点,并且基于您的场景的混乱信息,我会假设您有一些线程问题,您正在引用尚未NIL但悬挂Params属性的悬空Request实例。有时候你会很幸运并且有效,有时会吹AV。

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

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