SOAP Fault与HTTP 400

时间:2017-10-04 04:39:42

标签: http soap put

是否有一些规范说明Web服务器是否应返回HTTP 400(错误请求)或仅仅是SOAP错误消息,以防我向服务器发送正确的HTTP Post请求,但是包含错误的SOAP请求。在这种情况下,“错误的SOAP请求”意味着有效的XML文档,它不是以通常的三元素SOAP元素开头的:

<soapenv:Envelope>....
<soapenv:Header>...
<soapenv:Body>...

,而是直接使用这样的XML元素:

<namespace:elem .....

1 个答案:

答案 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>

这是标准行为。