1

我在解决另一个 SOAP 问题时发现了这个问题,并在此处发布以查看是否有人遇到过它或有任何建议。

问题:

  • 调用不存在的方法后,SOAP 服务器将不会处理接收 TSOAPAttachment 对象的方法。
  • 在调用不存在的方法后,TSOAPAttachment.SourceStream 变得不可访问并且 TSOAPAttachment.CachFile 为空
  • BorlandSoapAttachment(n) 临时文件被锁定并在问题发生时堆积起来。
  • 重启IIS或回收App Pool后恢复正常

创建此问题的步骤:

  • 最初使用 3 个方法创建一个简单的 Soap 客户端/服务器应用程序,其中一个应该接收并返回一个 TSOAPAttachment,另外两个可以是任何东西,int 或 string。
  • 我其实是按照这篇文章http://blogs.embarcadero.com/pawelglowacki/2008/12/18/38624创建了简单的soap应用程序,只是添加了一个接收和返回TSOAPAttachment的方法。所以我的界面是这样的:

代码

  TSimpleCalculator = class(TInvokableClass, ISoapCalculator)
  private
  public
    function add(a, b: Integer) : Integer; stdcall;
    function subtract(a, b: Integer): Integer; stdcall;
    function TestRequest(const Request: TSOAPAttachment): TSOAPAttachment; stdcall;
  end;
  • 创建此 Soap 服务器的客户端以调用所有三个方法。
  • 在这一点上,一切都应该愉快地工作,即。客户端可以调用所有 3 种方法,服务器可以成功响应所有这些方法。

现在,我删除了服务器中的 Subtract 函数,但仍然使用原始客户端。

  • 调用 Add 和 TestRequest 仍然成功完成。
  • 但是,在我调用不存在的 Subtract 函数后,TestRequest 将不再起作用,但 Add 函数仍然起作用。
  • TestRequest 将有我上面描述的所有问题,即。服务器仍然响应它,但它无法访问 TSOAPAttachment 对象。

任何建议表示赞赏。

4

1 回答 1

0

我以前用过soap,但来自Java,而不是Delphi。但是因为 SOAP 无处不在,没关系,它必须遵循 SOAP 规范。SOAP 服务器应返回 SOAP 错误作为来自 SOAP 请求的回复,该请求不会与已发布的方法发生冲突。您的 Delphi SOAP 服务器应该生成 SOAP 错误,并且您的 Delphi SOAP 客户端应该正确处理该错误。您可以使用 TCP 流量监视器并分配过滤器,使其仅显示 SOAP 流量或使用 SOAP 流量监视器。使用监视器,您可以看到发送到服务器的请求(包括消息)以及回复。您可以查看有关 SOAP 规范的 W3C 在线文档。毕竟,您的 SOAP 应用程序必须遵循规范。

于 2012-05-25T04:06:57.683 回答