Web services Apache托管的Web服务没有';t处理抖动类

Web services Apache托管的Web服务没有';t处理抖动类,web-services,delphi,apache,isapi,Web Services,Delphi,Apache,Isapi,我从我用Delphi 2009创建的ISAPI DLL开始,该模块在Windows XP上的IIS 5.1中运行时按预期运行。当使用Apache2.2.15和mod_isapi托管时,该模块无法正常运行。为了消除mod_isapi存在某些缺陷的可能性,创建了同一服务的Apache共享对象模块。但是,Apache模块也会出现类似的问题 通过创建共享实现代码的两个项目,我已经能够创建具有相同实现的ISAPI DLL和Apache模块。因此,它们之间的唯一区别是如何连接到主机web服务。这为我提供了三

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

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

  • IIS+ISAPI DLL
  • Apache+Apache模块
  • Apache+mod_isapi+isapi DLL
这两个项目都实现了一个用于测试的简单web SOAP服务。当您使用DelphiIDE创建新的Soap服务器应用程序时,所有序列化、反序列化、封送处理等都由自动生成的代码处理。该接口有几个简单的测试功能

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

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

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;
接口的实现中充满了伪代码,这些伪代码只创建了一个要发送回客户端的结果对象。实现中不存在重要的代码

当通过ISAPI托管在IIS中时,服务公开的所有方法都可以完美地工作

当托管在Apache中时,任何包含TRemotable参数的方法都会出错。在此接口中,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构建请求对象的方式是否与您预期的不同。

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

我并不了解isapi模块的线程模型,但听起来确实像是线程问题。也许如果你为你的dll选择了一个不同的线程模型,Apache会更高兴?@Marjan:我确实偶然发现了这个页面:在搜索有关ConitFlags和Conit_MULTITHREADED的信息时,试图在Apache中查找有关线程的信息。基于这些信息,我已经能够创建一个生成Apache模块的项目,这很好,因为基本上现在我有一个定义服务的代码库和两个项目文件,一个生成ISAPI DLL,另一个生成Apache模块。我现在正在测试Apache模块,看看这是否解决了问题。我还必须使用本页上的信息制作一个Apache 2.2模块,而不是Apache 2.0模块:我看到类似的错误,运行与Apache模块相同的代码,因此我认为这与我对可移动对象的使用有关。我并不知道任何事情关于isapi模块的线程模型,但听起来确实像是线程问题。也许如果你为你的dll选择了一个不同的线程模型,Apache会更高兴?@Marjan:我确实偶然发现了这个页面:在搜索有关ConitFlags和Conit_MULTITHREADED的信息时,试图在Apache中查找有关线程的信息。基于这些信息,我已经能够创建一个生成Apache模块的项目,这很好,因为基本上现在我有一个定义服务的代码库和两个项目文件,一个生成ISAPI DLL,另一个生成Apache模块。我现在正在测试Apache模块,看看这是否解决了问题。我还必须使用本页上的信息制作一个Apache 2.2模块,而不是Apache 2.0模块:我看到类似的错误,运行与Apache模块相同的代码,因此我认为这与我对可移动对象的使用有关。我可以向您保证这是正确的被正确地调用。我已经使用ISAPI dll设置了IIS,并将其称为测试客户端,没有错误。然后,我可以将Apache配置为在同一URL上托管DLL,以便对测试客户机来说,它似乎是完全相同的服务器。测试客户端在测试之间不会更改。DLL在测试之间不会更改。唯一的区别是如果Apache是主机