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

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

我正在为基于平板电脑的 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/

相关文章:

delphi - Delphi 什么时候尊重 `inline`,什么时候不尊重?

php - 如何将集成 mysql 连接到其他后关系数据?

delphi - 检查TEdit的Text属性在框架上是否为空

delphi - 在 Delphi 中更改 TMonthCalendar 的状态/格式

delphi - 使用实时弹出菜单最小化 Delphi 应用程序

delphi - 我可以将扩展记录的方法分配给Delphi中的事件吗?

delphi - 当拥有框架的表单被激活/停用时,是否有一种简单的方法来调用框架中的方法?

web-services - Silverlight 中的 MVVM - 异步服务逻辑去哪里了?

wcf - 在运行时更改 WSDL EndPointAddress 的地址/端口?

Javascript 从 Web 服务获取数据