由于Web服务的操作错误或SOAP消息处理过程中产生的SOAP错误。所有这些SOAP错误应报告和处理通过SOAP fault消息。SOAP规范提供了一个定义良好的共同框架来处理错误通过SOAP故障。
一个SOAP错误消息是一个正常的SOAP消息和一个众所周知的元素在体内(故障)。了解更详细的错误,SOAP消息结构定义了SOAP故障与不同的组件在它。
- 故障代码
- 子代码
- 原因
- 节点和作用
- 故障细节
子代码和故障细节元素信息项是用于携带特定于应用程序的错误信息。
这个ONVIF规范使用一个单独的命名空间为特定的故障(见5 11 2 2):
ter = “http://www.onvif.org/ver10/error”.
不同的Web服务的SOAP错误消息被定义为不同的Web服务定义。服务器和客户端将使用SOAP 1.2故障信息处理作为指定在本规范和应遵循WS-I Basic Profile 2.0 故障处理建议。
下面的例子是一个错误消息(通过HTTP SOAP 1.2错误消息)。斜体数值是实际值的占位符。
HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: bytes in body
CONTENT-TYPE: application/soap+xml; charset=”utf-8”
DATE: when response was generated
<?xml version=”1.0” ?>
<soapenv:Envelope
xmlns:soapenv="http://www.w3.org/2003/05/soap-
envelope"
xmlns:ter="http://www.onvif.org/ver10/error"
xmlns:xs="http://www.w3.org/2000/10/XMLSchema">
<soapenv:Body>
<soapenv:Fault>
<soapenv:Code>
<soapenv:Value>fault code </soapenv:Value>
<soapenv:Subcode>
<soapenv:Value>ter:fault subcode</soapenv:Value>
<soapenv:Subcode>
<soapenv:Value>ter:fault subcode</soapenv:Value>
</soapenv:Subcode>
</soapenv:Subcode>
</soapenv:Code>
<soapenv:Reason>
<soapenv:Text xml:lang="en">fault reason</soapenv:Text>
</soapenv:Reason>
<soapenv:Node>http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver</soapenv:Node>
<soapenv:Role>http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver</soapenv:Role>
<soapenv:Detail>
<soapenv:Text>fault detail</soapenv:Text>
</soapenv:Detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
下表总结了一般的SOAP故障代码(故障代码中定义了SOAP版本1.2第1部分:消息传递框架)。服务器和客户端可以定义额外的故障子码供应用程序使用。
我们区分通用故障和特定的错误。任何命令可以生成一个通用的故障。具体的故障都与一个特定的命令或命令集。特定的错误,适用于一个特定的命令定义在命令定义表。
在下面的表格中,故障代码,子代码和故障原因是规范值。description列添加信息。
表5列出了通用的故障码,如适用,子码。所有服务器和客户端实现将处理下面列出所有的缺点。任何web服务命令可以返回一个或几个通用的缺点。
所列的故障无子码无任何代码值。
故障代码 | 子代码 | 故障原因 | 描述 |
---|---|---|---|
env:VersionMismatch | SOAP版本不匹配 | 设备发现无效元素信息项而不是预期的封装元素信息项。 | |
env:MustUnderstand | SOAP头代码块不理解 | 一个或多个必需的SOAP头代码块都不理解。 | |
env:DataEncodingUnknown | 不支持SOAP的数据编码 | SOAP头块或SOAP体子元素信息项是作用域与数据编码不支持的设备。 | |
env:Sender | ter:WellFormed | 格式良好的错误 | 发生入侵格式良好的XML |
env:Sender | ter:TagMismatch | 标签不匹配 | 有一个标签名称或命名空间不匹配。 |
env:Sender | ter:Tag | 没有标签 | XML元素标记不见了。 |
env:Sender | ter:Namespace | 命名空间错误 | 发生SOAP命名空间错误。 |
env:Sender | ter:MissingAttr | 所需的属性不存在 | 缺失一个必要的属性。 |
env:Sender | ter:ProhibAttr | 禁止属性 | 存在一个被禁止的属性。 |
env:Sender | ter:InvalidArgs | 无效的参数 | 一个错误由于下列: * 缺少的参数 * 参数太多 * 参数是错误的数据类型。 |
env:Sender | ter:InvalidArgVal | 参数值无效 | 参数值是无效的。 |
env:Sender | ter:UnknownAction | 未知的操作 | 一个未知的指定操作。 |
env:Sender | ter:OperationProhibited | 操作不允许 | 请求的操作不允许的设备。 |
env:Sender | ter:NotAuthorized | 发送方未授权 | 请求的操作需要授权和发送方未被授权。 |
env:Receiver | ter:ActionNotSupported | 可选操作未执行 | 请求的操作是可选的,而不是由设备实现。 |
env:Receiver | ter:Action | 操作失败 | 请求的SOAP操作失败。 |
env:Receiver | ter:OutofMemory | 内存不足 | 设备没有足够的内存来完成此操作。 |
env:Receiver | ter:CriticalError | 临界误差 | 该设备已经遇到一个错误条件,它不能恢复本身,需要重置或动力循环。 |
具体的故障只适用于一个特定的命令或命令集。特定的错误声明为部分的服务定义。
如果服务器等待开始的入站消息,没有收到的SOAP消息,服务器不应产生一个SOAP错误,而是发送一个HTTP错误响应。
HTTP错误 | HTTP错误代码 | HTTP原因 |
---|---|---|
Malformed Request | 400 | 错误请求 |
Requires Authorization | 401 | 非法的请求;未被授权的请求 |
HTTP Method is neither POST or GET | 405 | 不允许使用该方法 |
Unsupported message encapsulation method | 415 | 不支持的媒体 |
服务器应该避免报告内部错误,因为这可能暴露的安全漏洞,可以被滥用。