我正在为基于平板电脑的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。
希望这清楚到足以理解。我不是在寻找具体的答案,因为我没有提供足够的答案;我只是在寻找有关从哪里开始的建议。非常感激! :)
答案 0 :(得分:2)
RequestInfo.Params在构造函数中创建,并且在析构函数中有一个FreeAndNil(),因此一旦Request为Free,Assigned()将在此属性上失败。
考虑到这一点,并且基于您的场景的混乱信息,我会假设您有一些线程问题,您正在引用尚未NIL但悬挂Params属性的悬空Request实例。有时候你会很幸运并且有效,有时会吹AV。
或者,您在代码中以某种方式手动NIL表示.Params属性。也许你正在传递这个TStringList对象,而其他东西正在意外地释放它。在请求完成之前,Indy不会自由。
总而言之,你是对的,因为你没有提供足够的信息,问题可能应该被关闭。