创建“虚拟”的SOAP Web 服务
在 Caché 中处理 SOAP 请求时,有时需要通过直接访问(有时是编辑)所发送的 XML(即 SOAP 请求和随后的 SOAP 响应)来调试错误。 如果要调试 Caché Web 服务,使用 SoapUI (https://www.soapui.org/) 之类的工具手动创建和控制 SOAP 请求通常很有用,这样可以很容易地在 Caché Web 服务上看到调整的效果。
但是如果已经有 Web 服务(可能不是 Caché),并且想要调试相关的 Caché Web 客户端该怎么办? 您可能已将 SOAP 响应 XML 保存在文件中(例如 Caché SOAP 日志),您需要一个“虚拟”Web 服务将其发送到 Caché Web 客户端,就像实际的 Web 服务一样操作。
由于我经常在技术支持的过程中需要调试客户的 Caché Web 客户端,我创建了这样一个“虚拟”的Web 服务 – 见下文:
Class JSUtil.DummyWebService Extends %CSP.Page
{
/// Mimic a SOAP Web Service by sending the specified SOAP Response XML.
/// Typically this XML will be copied-and-pasted from a SOAP log.
Parameter CONTENTTYPE = "text/xml";
/// File containing the SOAP Response XML:
Parameter XMLFILENAME = "C:\data\soapresponse.txt";
ClassMethod OnPage() As %Status
{
set XML=""
set stream = ##class(%Stream.FileCharacter).%New()
set sc = stream.LinkToFile(..#XMLFILENAME)
while 'stream.AtEnd {
set XML = XML_stream.Read()
}
write XML
quit $$$OK
}
}
要使用 JSUtil.DummyWebService 类:
现在,当调用 Caché Web 客户端时,它将收到参数 XMLFILENAME 指向的 SOAP 请求 XML。
我已经多次使用这种方法来帮助调试 Caché Web 客户端。 参考以下示例:
SOAP 日志的“Web 客户端的输入”中包含以下错误:
ERROR #6203: Unexpected Element
(完整的 SOAP 日志可在此处找到:https://github.com/ISC-schulman/InterSystems/raw/master/soaplog.txt)
我们还有 Web 服务的 WSDL (https://github.com/ISC-schulman/InterSystems/raw/master/example.wsdl),但无法访问 Web 服务本身。 (虽然这对于 InterSystems 支持来说很常见,但不可否认,对于客户可能并不常见 – 这只是一个简单的示例,说明如何使用 DummyWebService。)
首先,使用 DummyWebService 重现错误:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://test.systelab.com/">
<soapenv:Header/>
<soapenv:Body><req:createAsynchronuosRequestResponseElement>OK</req:createAsynchronuosRequestResponseElement>
</soapenv:Body>
</soapenv:Envelope>
set client = ##class(MyWebService.RequestWSSoapHttpPort).%New()
do client.createAsynchronuosRequest("x")
quit
接下来我们解决这个错误。 这里会经历一些过程或反复试验,但同样只是为了说明如何使用 DummyWebService。
在 SOAP 向导的步骤 3 中选择“对于文档样式的 Web 方法使用未包装的消息格式(Use unwrapped message format for document style web methods)”
(注意:使用“未包装的消息格式(unwrapped message format)”是解决 Web 客户端问题的常见解决方案 – 有关详细信息,请参见我们的文档中的“使用 SOAP 向导”。)
总结
可以使用 DummyWebService 类将指定的 SOAP 响应(例如,从 SOAP 日志)发送到 Caché Web 客户端,以模拟 Web 服务的响应。