【问题标题】:TIdHTTPServer raise EThread error 6 when activating it in my DUnit testTIdHTTPServer 在我的 DUnit 测试中激活它时引发 EThread 错误 6
【发布时间】:2012-03-17 15:59:29
【问题描述】:

我需要一个本地 HTTP 服务器来进行单元测试。

当我尝试在SetUp 激活 TIdHTTPServer 时,它失败并显示 EThread 消息:

“线程错误:描述符无效 (6)”

这是我初始化它的方式:

type
  TestMyUnit = class(TTestCase)
...
procedure TestMyUnit.SetUp;
begin
  FServer := TIdHTTPServer.Create(nil);
  FServer.OnCommandGet := HTTPServerCommandGet;
  FServer.Active := True;   // <---- This will cause error
end;

使用 Indy 的 TIdHTTPServer 和 DUnit 框架可能会有一些限制?

  • 德尔福 2010
  • 印地 10

TIdListenerThread.Run proc(IdCustomTCPServer 单元)中这一行之后的某处引发了异常

LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn);

但是,我无法更深入地追踪它,我不知道为什么。

【问题讨论】:

  • 我要问这个...你试过在不同的机器上运行可执行文件吗?

标签: delphi delphi-2010 indy indy10 dunit


【解决方案1】:

您可能必须允许 DUnit 可执行文件在防火墙设置中打开端口...控制面板 > Windows 防火墙 > 高级设置 > 入站规则。

通常 Windows 会在可执行文件第一次尝试打开端口时询问您,但我会检查其中是否有规则。

编辑:

只需添加更多信息,错误“描述符无效”看起来像一个winsock错误,可能是因为您的代码无法打开端口。可能是因为它被防火墙阻止了(正如我上面的意思),或者可能是你有另一个程序打开了那个端口……也许像 IIS?我会在某处选择一个高于 1024 的端口,并将您的网络服务器设置为使用该端口(显然还有您的客户端)。

编辑 2:

我设置 TIdHttpServer 的代码是:

FServer := TIdHttpServer.Create(nil);
FServer.DefaultPort := 7777;
FServer.AutoStartSession := True;
FServer.OnCommandGet := ServerCommandGet;
FServer.OnCreatePostStream := ServerCreatePostStream;

FServer.Active := True;

【讨论】:

  • 禁用防火墙并将DefaultPort设置为10080后没有变化
  • 看来我找到了问题所在。我有自己设计的组件(用于此单元测试)的 DPK,并且有 1 个单元引用了 Indy。在我重建了那个包之后,编译器建议我向 Indy 添加一些新的 DCCReference。重新安装软件包后,该错误消失了。您如何看待,我应该将其添加为答案还是最好检查您的答案是否正确?我认为我的情况并不常见。
  • 我会添加一个你自己的答案来解释你做了什么,24小时后,接受它:)
【解决方案2】:

解决了。我有自己设计的组件(用于此单元测试)的 DPK,并且有 1 个单元引用了 Indy。在我重建了那个包之后,编译器建议我向 Indy 组件添加一些新的 DCCReference。重新安装软件包后,单元测试中的错误消失了。

我无法想象因果关系,但现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-09
    • 2015-11-15
    • 1970-01-01
    • 2012-10-12
    • 2021-03-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多