当出现异常时,如何获取SOAP响应?

时间:2011-02-16 09:25:08

标签: web-services delphi soap response

我拨打了第三方网络服务的电话,并使用以下格式的消息取回ESOAPHTTPException:

此处有加密消息 - URL:http://webserviceurl - SOAPAction:performWithArgList

现在,此Web服务的支持人员已要求提供完整的SOAP响应。通常,我会将事件处理程序附加到THTTPRIO.OnAfterExecute并简单地将我收到的流的内容存储为参数。

但是由于Delphi引发了异常,因此该事件处理程序不会执行。我理解异常可能实际上意味着服务以某种灾难性的方式失败了,但仍然应该有某种响应(不是超时错误)。

在 Delphi将其变为异常之前,是否有其他方法可用于捕获响应

3 个答案:

答案 0 :(得分:6)

对于基于ERemotableException的异常,您需要查看OnAfterExecute事件,因为它表示服务发回的错误...但对于ESOAPHTTPException(您的情况),您将要处理OnWinInetError事件({ {3}})。

D2010在SOAP HTTP处理中引入了一个错误。典型的症状是它会错过HTTP失败(例如服务器忙时)。所以也许这不是你遇到的问题,但不知道你所看到的确切错误代码或消息,人们无法分辨。您可以在此处找到更多详细信息:http://docwiki.embarcadero.com/VCL/en/SOAPHTTPTrans.THTTPReqResp.OnWinInetError

例如,如果您收到有关“处理处于错误状态”的错误,则上述问题就是罪魁祸首。这意味着“发送”失败但运行时很乐意继续读取响应。您可以从此主题中找到有关该主题的更多信息:https://forums.embarcadero.com/message.jspa?messageID=304898&tstart=0

所以你应该处理OnWinInetError并获取错误代码(LastError param)。这可能是理解失败的关键。

干杯,

布诺

答案 1 :(得分:1)

是的,您可以使用RIO事件在反序列化之前检查响应。

OnAfterExecute

您将获得响应作为流,您可以将其转换为字符串。然后你可以检查异常,beign完全空,或以''开头等坏事,通常(在我的情况下)表示服务没有启动。

答案 2 :(得分:1)

我会打开SOAPHTTPTrans的源代码并在THTTPReqResp.Check()中放置一个断点,就在“if error”里面。当你到达断点时,你会更多地了解什么是错的。看一下调用堆栈,看看你是怎么来到这里的。创建和发送您的请求可能会出错。如果是在发送期间,则可能不会在网络上出现,因此您不会使用WireShark,Fiddler或SoapUI看到它。

IMO,像Check()这样的函数应该有一个CallerLocation的额外参数,所以不要调用它: 检查(未分配(请求),错误); 你这叫: 检查(未分配(请求),错误,'THTTPReqResp.SendGet'); 并且Check会将CallerLocation附加到错误消息中,并且您(更多)知道正在发生的事情。