我正在为基于平板电脑的 HTML 客户端编写一个基于 Delphi 的 Windows 服务器。
大多数文件都是未经处理的,正如您对网络服务器所期望的那样,但少数特殊关键字被解释为与服务器上其他软件交互的特殊命令。
大多数时候,一切都很好。但是,似乎是随机的,我会遇到访问冲突,而且是在尝试检索 GET 参数之一时发生的。
这让我抓狂,所以我将整个事情封装到一个函数中,然后开始测试 TIdHTTPRequestInfo 数据的存在(此处显示为公共(public)属性 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 后在我的日志文件中(慢慢地,我不会敲击服务器)。
当我在 block 内设置断点并在到达该点时检查 Request 的值时,整个 TIdHTTPRequestInfo 结构将填充默认的空数据。如果我检查浏览器以查看它发送的请求,这就是我所期望的......(例如,通常只是对“/details?id=222”的请求)。
我应该注意,我是在 Windows 7 64 位上进行开发的,所以我一直对由它引起的类似事情感到偏执。我不止一次遇到过问题,结果都是因为 64 位的怪异。
其他信息:Indy 9、Delphi 2007。
希望这足以清楚地理解。我并不是在寻找具体的答案,因为我提供的还不够;我只是在寻找关于从这里去哪里的建议。非常感激! :)
最佳答案
RequestInfo.Params 在构造函数中创建,析构函数中有一个 FreeAndNil(),因此一旦请求被释放,Assigned() 将在此属性上失败。
鉴于此,并根据您的场景的困惑信息,我假设您存在一些线程问题,其中您引用了一个尚未被 NIL 化但 Params 属性已经被 NIL 化的悬空 Request 实例。有时你运气好,它会起作用,有时它会毁掉 AV。或者,您可以在代码中以某种方式手动对 .Params 属性进行 NIL 处理。也许您正在传递此 TStringList 对象,而其他东西意外地释放了它。在请求完成之前,Indy 不会释放它。
总而言之,您是正确的,因为您没有提供足够的信息,问题可能应该结束。
关于web-services - Indy IdHTTPServer GET 响应参数随机丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986786/