是否有一些规范说明Web服务器是否应返回HTTP 400(错误请求)或仅仅是SOAP错误消息,以防我向服务器发送正确的HTTP Post请求,但是包含错误的SOAP请求。在这种情况下,“错误的SOAP请求”意味着有效的XML文档,它不是以通常的三元素SOAP元素开头的:
<soapenv:Envelope>....
<soapenv:Header>...
<soapenv:Body>...
,而是直接使用这样的XML元素:
<namespace:elem .....
答案 0 :(得分:0)
我目前无法找到任何正式内容。根据经验,如果您的XML格式错误,则会获得400 HTTP;如果SOAP消息中存在某种不正确的值,则会收到SOAP错误消息。< / p>
要记住HTTP的一件事是SOAP服务使用的一种协议。如果需要,您可以通过STMP(电子邮件)或其他协议运行SOAP服务。 HTTP仅仅是传输。因此,不需要在标准文档中包括这些特定的HTTP。 SOAP 400中的HTTP 400意味着非常糟糕的消息无法传递。
例如,如下所示的格式错误的xml应该提供HTTP 400:
<nonsense> <!-- opening tag with no closing tag-->
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ecol="http://www.blahblahablha">
<soapenv:Header/>
<soapenv:Body>
<ecol:GetDatabaseConnectionInfo/>
</soapenv:Body>
</soapenv:Envelope>
在下面的示例中,我的消息有一个值为?
的GUID,这是一个错误,但是由于XML正确形成,消息将在SOAP错误消息中返回。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ec="http://www.blahablha.au/foo" xmlns:irix="http://www.blahblah/IRIX_Headers_V1" xmlns:irix1="http://schemas.datacontract.org/2004/07/IRIXContract.MsgHeaderBase">
<soapenv:Header/>
<soapenv:Body>
<ec:GetAccountActiveArrangement>
<ec:GetAccountActiveArrangementReq>
<irix:MsgReqHdr>
<!--Optional:-->
<irix:MsgGUID>?</irix:MsgGUID>
<!--Optional:-->
<irix:MsgDateTime>?</irix:MsgDateTime>
<!--Optional:-->
<irix:SecCredInfo>
<!--Optional:-->
<irix:IRIXUserID>?</irix:IRIXUserID>
<!--Optional:-->
<irix:IRIXPassword>?</irix:IRIXPassword>
<!--Optional:-->
<irix:AuthToken>?</irix:AuthToken>
<!--Optional:-->
<irix:ConsumerSystemID>?</irix:ConsumerSystemID>
</irix:SecCredInfo>
</irix:MsgReqHdr>
<ec:accountNumber>70001</ecol:accountNumber>
</ec:GetAccountActiveArrangement>
</soapenv:Body>
</soapenv:Envelope>
发送此结果会出现以下错误:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:DeserializationFailed</faultcode>
<faultstring xml:lang="en-AU">The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://www.blah blah/ECollNXDB_V1:GetAccountActiveArrangementReq. The InnerException message was 'There was an error deserializing the object of type IRIXNXSoapServices.Message.Operations.Account.Get.GetAccountActiveArrangementReqV1. The value '?' cannot be parsed as the type 'Guid'.'. Please see InnerException for more details.</faultstring>
<detail>
<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HelpLink i:nil="true"/>
<InnerException>
<HelpLink i:nil="true"/>
<InnerException>
<HelpLink i:nil="true"/>
<InnerException>
<HelpLink i:nil="true"/>
<InnerException i:nil="true"/>
<Message>Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).</Message>
这是标准行为。