【发布时间】: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 的强大功能之一是能够捕获和回放原始数据以进行调试。您可以使用TIdLogFile或TIdLogStream捕获入站数据,然后附加TIdIOHandlerStream进行播放,无需连接到真实服务器。 -
我有一个更有经验的 Delphi/Indy 编码器在这里工作,他很确定问题是内部状态被线程计时问题所拖累。我对线程的经验并不丰富,所以当我写我所做的事情时,我在思考相当“连续”。他将重做我的服务器逻辑,我将不得不将此作为学习经验。 :) 谢谢大家的提示。你摇滚。
标签: web-services delphi delphi-2007 indy indy-9