调用不存在的方法后,Delphi SOAP服务器无法处理SOAPAttachemnt

时间:2012-05-25 02:45:32

标签: delphi soap

我在解决另一个SOAP问题时发现了这个问题,只是在这里发帖,看看是否有人经历过这个问题或者有任何建议。

问题:

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

创建此问题的步骤:

  • 最初使用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对象。

任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

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