第四十九章 解决 IRIS 中的 SOAP 问题 - 发送消息时出现问题
如果在向 IRIS Web
服务或客户端发送或接收 SOAP
消息时遇到问题,请考虑以下常见场景列表:
-
SOAP
消息可能包含极长的字符串或二进制值,超出字符串长度限制。在这种情况下,IRIS
会抛出以下错误之一:-
<MAXSTRING>
错误 - 数据类型验证错误(也可能有其他原因):
-
ERROR #6232: Datatype validation failed for tag your_method_name ...
当向导读取 WSDL
时,它假定任何字符串类型的输入或输出都可以在 IRIS
中表示为 %String
。同样,它假定任何 XML
类型为 base64Binary
的输入或输出都可以在 IRIS
中表示为 %xsd.base64Binar
。WSDL
中没有信息来告知 SOAP
向导此输入或输出可能超出字符串长度限制。
-
Web
服务或客户端可能会收到WS-Security
标头,但尚未配置为识别它们。这可能会导致类似以下的一般错误:
<ZSOAP>zInvokeClient+269^%SOAP.WebClient.1
此类错误也可能有其他原因。如果收到此类错误,请首先检查消息是否包含 WS-Security
标头;如果是,请将以下内容添加到 Web
服务或客户端并重新编译:
Parameter SECURITYIN="REQUIRE";
此外,如果 生成了安全策略(在配置类中),可能需要编辑该策略以提供缺失的详细信息;请参阅编辑生成的策略。如果不这样做,可能会收到如上所述的一般错误。
-
根据
SOAP
规范,Web
服务或客户端可能需要比应有的更具体的消息格式。(对于IRIS
中没有的服务或客户端,可能会发生这种情况。) 遇到过以下情况,此处按(大约)最常见到最不常见的顺序列出:-
Web
服务或客户端要求消息为消息中的所有元素指定xsi:type
属性。要指定此属性的使用,请参阅控制xsi:type
属性的使用,该属性适用于Web
服务和客户端。 - 对于空字符串值,
Web
服务或客户端需要空元素(而不是省略元素)。要解决此问题,可以控制空字符串参数的形式,请参阅控制空字符串参数的形式,该内容适用于Web
服务和客户端。 -
Web
服务或客户端需要特定的命名空间前缀。IRIS
不提供指定命名空间前缀的方法。
但是,对于
SOAP
信封,您可以指定要使用的前缀。请参阅指定SOAP
信封前缀,它适用于Web
服务和客户端。Web
客户端要求引用SOAP
操作。要解决此问题,请参阅引用SOAP
操作(仅限SOAP 1.1
)。Web
服务或客户端要求在每个SOAP
消息的开头添加BOM
(字节顺序标记)。由于SOAP
消息采用UTF-8
编码,不存在字节顺序问题,因此不需要BOM
。请参阅向SOAP
消息添加字节顺序标记,该内容适用于Web
服务和客户端。
这些问题的症状取决于所使用的第三方产品。
-
-
Web
服务或客户端可能不符合WSDL
。对于IRIS Web
服务或客户端来说,这种情况不应该发生,但在其他情况下可能会发生。InterSystems
已经看到过以下情况:- 消息中的元素不在
WSDL
所需的命名空间中。 - 消息中元素的顺序与
WSDL
不一致。
要确定服务或客户端是否符合
WSDL
,请将消息与WSDL
进行比较。或者,对于第三方
Web
服务,要确定该Web
服务是否符合WSDL
,执行以下操作会很有用:使用第三方工具生成
Web
客户端。-
从该
Web
客户端发送消息:- 如果成功,则很可能
Web
服务确实期望并发送与其WSDL
一致的消息,而问题的原因在其他地方。在这种情况下,将此客户端发送的消息与IRIS
客户端发送的消息进行比较。 - 如果不成功,则可能是
Web
服务不期望或不发送与其WSDL
一致的消息。
- 如果成功,则很可能
- 消息中的元素不在
Web
服务或客户端可能会发送 不支持的格式的消息。检查正在使用的WSDL
并确保它在IRIS
中受支持很有用;请参阅使用WSDL
。请注意,这些详细信息在IRIS
中会随时间而变化。