【问题标题】:Indy IdHTTPServer GET response parameters randomly missingIndy IdHTTPServer GET 响应参数随机丢失
【发布时间】:2011-08-08 18:29:10
【问题描述】:

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

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

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

这让我发疯了,所以我将整个事情封装到一个函数中,然后开始测试 TIdHTTPRequestInfo 数据是否存在(此处显示为公共属性 Request em> 在类内):

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 位的古怪。

附加信息:Indy 9,Delphi 2007。

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

【问题讨论】:

  • 如果您真的“不是在寻找具体的答案”,那么您来错地方了——我投票结束了,因为不是一个真正的问题。你有 Indy 源代码,所以继续调试。找到应该分配Params 的位置。逐步了解这是如何发生的。与失败案例进行比较,看看有什么不同。如果您对操作系统有疑虑,请使用虚拟机在“更简单”的平台上进行测试。
  • 听起来您需要添加大量跟踪消息日志记录并进行一些困难的调试。你在使用 SOAP+WSDL 包装器吗?
  • 我建议您使用数据包嗅探器,例如 Wireshark,或者将 Indy 自己的一个 TIdLog... 组件附加到 TIdHTTP,以查看实际的请求/响应数据实际上是什么样的,然后你可以通过 Indy 的代码来查看它是如何被处理的。 Indy 的强大功能之一是能够捕获和回放原始数据以进行调试。您可以使用TIdLogFileTIdLogStream 捕获入站数据,然后附加TIdIOHandlerStream 进行播放,无需连接到真实服务器。
  • 我有一个更有经验的 Delphi/Indy 编码器在这里工作,他很确定问题是内部状态被线程计时问题所拖累。我对线程的经验并不丰富,所以当我写我所做的事情时,我在思考相当“连续”。他将重做我的服务器逻辑,我将不得不将此作为学习经验。 :) 谢谢大家的提示。你摇滚。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 您在线程问题上走在了正确的轨道上。谢谢! :)
猜你喜欢
  • 2012-09-11
  • 2018-12-28
  • 1970-01-01
  • 2018-07-08
  • 2010-10-20
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多