web-services - Apache 托管 Web 服务不处理 TRemotable 类

标签 web-services delphi apache isapi

我从使用 Delphi 2009 创建的 ISAPI DLL 开始,该模块在 Windows XP 上的 IIS 5.1 中运行时按预期执行。使用 Apache 2.2.15 和 mod_isapi 托管时,同一模块无法正常运行。为了消除 mod_isapi 有缺陷的可能性,创建了同一服务的 Apache 共享对象模块。然而,作为 Apache 模块也会出现类似的问题。

通过创建两个共享实现代码的项目,我能够创建具有相同实现的 ISAPI DLL 和 Apache 模块。因此,它们之间的唯一区别在于它们连接到主机 Web 服务的方式。这为我提供了托管此服务的三个选项:

  • IIS + ISAPI DLL
  • Apache + Apache 模块
  • Apache + mod_isapi + ISAPI DLL。

这两个项目都实现了一个简单的 Web SOAP 服务来进行测试。当您使用 Delphi IDE 创建新的 Soap Server 应用程序时,所有序列化、反序列化、编码(marshal)处理等均由自动生成的代码处理。该界面有一些简单的测试功能。

为了创建 Apache 模块,我必须遵循以下说明:

SOAP 服务实现的接口(interface)非常简单。它有一些变体来测试不同的东西。

IPdiSvc2 = interface(IInvokable)
['{532DCDD7-D66B-4D2C-924E-2F389D3E0A74}']
  function Echo(data:string): string; stdcall;
  function SendFile1(request: TSendFileRequest; attachment: TSOAPAttachment):
    TSendFileResponse; stdcall;
  function SendFile2(request:string): TSendFileResponse; stdcall;
  function SendFile3():TSendFileResponse; stdcall;
  function SendFile4(attachment: TSoapAttachment): TSendFileResponse; stdcall;
  function SendFile5(request: TSendFileRequest):TSendFileResponse; stdcall;
end;

TSendFileRequest 和 TSendFileResponse 也非常简单。

TSendFileRequest = class(TRemotable)
  private
    FFilename: string;
  published
    Property Filename: string read FFilename write FFilename;
end;

TSendFileResponse = class(TRemotable)
  private
    FFileID: Int64;
  published
    Property FileID: Int64 read FFileId write FFileID;
end;

该接口(interface)的实现充满了虚拟代码,这些代码只是创建一个结果对象以发送回客户端。实现中不存在重要的代码。

当通过 ISAPI 托管在 IIS 中时,该服务公开的所有方法都可以完美运行。

当托管在 Apache 中时,任何包含 TRemotable 参数的方法都会出错。在此接口(interface)中,SendFile1 和 SendFile5 受到影响,因为它们有 TSendFileRequest 作为参数。对 SendFile1 或 SendFile5 的第一次调用按预期工作。成功调用 SendFile1 或 SendFile5 后对任何方法的下一次调用都会导致访问冲突。通过 Apache 共享对象模块以及使用 mod_isapi 的 ISAPI DLL 都可以观察到此行为。

我不确定问题出在哪里,但我看到三个选项:我的代码、Delphi 代码或 Apache 代码。我只是不知道在哪里。

这个问题非常令人沮丧,因为完全相同的二进制 ISAPI DLL 在 IIS 中可以工作,但在 Apache 中却不行。我将其归因于 ISAPI 主机中的实现差异,但在 Apache 共享对象模块中发生同样的错误意味着发生了其他情况。

为了完整起见,我决定创建同一 Web 服务的 CGI 版本。当在 IIS 下运行时,CGI 版本可以完美运行。在 Apache 中运行时,所有请求都会导致错误:“XML 文档必须具有顶级元素。行:0”

看来 Apache 今天很讨厌我。

最佳答案

要排除您是否错误地调用了它,请使用 SoapUI 来使用 WSDL 并发送一些测试消息。看看他们是否成功。如果它在 SoapUI 中工作,则说明客户端代码有问题。如果不起作用,那就是服务器端的问题。另请查看 SoapUI 构建请求对象的方式是否与您预期的不同。

关于web-services - Apache 托管 Web 服务不处理 TRemotable 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3017017/

相关文章:

php从base64字符串将blob插入mysql

delphi - 如何创建一个可与 VCL 和 FMX 一起使用的内部计时器?

apache将一个目录下的所有hash标签重写为斜杠标签

apache - RewriteRule 不排除现有文件/目录

linux - httpd 不会启动并且没有错误

java - JMS 与 Web 服务

c# - 在构建供客户端使用的 Web 服务时,其他方的应用程序使用何种语言编写是否重要?

java - 将 WAR 转换为 EAR 和其他 Glassfish 故事

Delphi:从 TBitbtn 显示/隐藏字形

delphi - DWScript:在运行时向 dwsUnit 添加新的数组定义