gpt4 book ai didi

web-services - Indy IdHTTPServer GET 响应参数随机丢失

转载 作者:行者123 更新时间:2023-12-03 18:38:51 33 4
gpt4 key购买 nike

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

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

大多数时候,一切都很好。但随后,似乎是随机的,我会遇到访问冲突,这将是在尝试检索其中一个 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 位的古怪。

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

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

最佳答案

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

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

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

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

关于web-services - Indy IdHTTPServer GET 响应参数随机丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986786/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com