2015-05-21 3 views
3

Я пытаюсь использовать веб-службу, используя клиент, сгенерированный с использованием WSDL. Все мои сообщения хороши без каких-либо проблем (SOAPFault можно поймать и вернуть ошибку соответственно), за исключением того, что для определенной операции, например, при использовании неправильных учетных данных (пока что они определены), он возвращает ответ 500 и SOAPFault XML вместе с ним. Я проверил и увидел XML-файл Fault, используя приложение SoapUI. Я могу подтвердить, что XSD для этого SOAPFault XML такой же, как и для других (хороших) сбоев.Получить xml-содержимое ответа сервера 500 (ошибка внутреннего сервера)

Поскольку ответ сервера 500 (мое предположение), я не могу уловить это как исключение SOAPException, но как нормальное исключение. Как нормальное исключение, e.getMessage() не помогает мне точно знать, что такое ошибка.

Итак, это то, что я делаю в данный момент,

 try { 
      outResponse = port.Service(input); 

      if (condition = true) 
       result = "SUCCESS"; 
      else 
       result = "FAILURE"; 

     } catch (SOAPFaultException ex) { 
      result = faultReader(ex); 

      /* fault reader will strip the fault xml and get the error accordingly.*/ 

     } catch (Exception e){ 
      logger.info(e.getMessage()); 
      logger.info("Possible cause may be wrong user credentials."); 

      /* I am expecting to read the SOAPFault XML here */ 

      result = "FAILURE"; 
     } 
     return result; 

Как я могу прочитать этот XML посланный вместе с ошибкой сервера 500?

примечание: у меня нет большого контроля над серверной частью для изменения любых параметров. То, что я намереваюсь сделать, - это поймать как нормальное исключение, прочитать отправленный код ошибки xml и прочитать сообщение об ошибке и соответственно вернуть его.

Заранее спасибо.

[обновление] Это строка ошибка выборки я получаю вместе с ответом сервера 500. (это не связано с учетными данными, но похоже)

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:Fault> 
     <faultcode>SOAP-ENV:Server</faultcode> 
     <faultstring>null</faultstring> 
     <detail> 
      <IBResponse type="error"> 
       <DefaultTitle>Response</DefaultTitle> 
       <StatusCode>20</StatusCode> 
       <MessageID>505</MessageID> 
       <DefaultMessage>Unable to find a Routing corresponding to the incoming request message.</DefaultMessage> 
       <MessageParameters/> 
      </IBResponse> 
     </detail> 
     </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

[обновление] я обнаружил, что, когда серверный ответный код равен 500, тип содержимого установлен в text/html, тогда как исключение SOAPFault ожидает текст/xml.

HTTP/1.1 500 Internal Server Error 
Date: Fri, 22 May 2015 06:30:40 GMT 
Content-Length: 634 
Content-Type: text/html 
Connection: Close 
<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
     <faultcode>SOAP-ENV:Server</faultcode> 
     <faultstring>null</faultstring> 
     <detail> 
     <IBResponse type="error"> 
      <DefaultTitle>Integration Broker Response</DefaultTitle> 
      <StatusCode>20</StatusCode> 
      <MessageID>535</MessageID> 
      <DefaultMessage><![CDATA[User Password required for Service Operation CI_SH_USERMAINT_CI_UP. (158,535)]]></DefaultMessage> 
      <MessageParameters> 
      <Parameter><![CDATA[CI_SH_USERMAINT_CI_UP]]></Parameter> 
      </MessageParameters> 
     </IBResponse> 
     </detail> 
    </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Так что, возможно ли это даже прочитать этот конверт SOAP?

+0

Можете ли вы опубликовать строку xml? – jdweng

+0

обновил мой запрос с помощью строки ответа xml. – Vimal

+0

Это ответ «SOAP». Используйте клиент SOAP! – hek2mgl

ответ

1

Мне потребовалось некоторое время, но я нашел решение. Надеюсь, это поможет другим, которые сталкиваются с подобными проблемами. Сначала определите его как WebException. Затем вы можете получить ответ об ошибке из потока ответов.

 try 
    { 
     webResponse = (HttpWebResponse)req.GetResponse(); 
     statusCode = webResponse.StatusCode; 
     Response.Write("Status code " + statusCode.ToString()); 

     } 
     catch (WebException ex) 
     { 
      if (ex.Response != null) 
      { 
       StreamReader responseReader; 

      using (responseReader = new StreamReader(ex.Response.GetResponseStream())) 
       { 
        string exMessage = responseReader.ReadToEnd().ToString(); 
        Response.Write("<br> Response from textkernel"+exMessage); 
       } 
      }     
     } 
Смежные вопросы