2013-05-13 4 views
7

Я успешно работаю с сторонним мыльным сервисом. Я добавил сервисную ссылку на мыльную веб-службу, которая автоматически генерировала классы.Извлечение детали из WCF FaultException response

При возникновении ошибки она возвращает ответ мыло, как это:

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:Fault> 
     <faultcode>SOAP-ENV:Client</faultcode> 
     <faultstring xsi:type="xsd:string">Error while reading parameters of method 'Demo'</faultstring> 
     <detail xsi:type="xsd:string">Invalid login or password. Connection denied.</detail> 
     </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

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

catch (FaultException ex) 
{ 
    MessageFault msgFault = ex.CreateMessageFault(); 
    var elm = msgFault.GetDetail<string>(); 
    //throw Detail 
} 

Однако это ошибки с следующий как подробно узел не является объектом:

Expecting element 'string' from namespace 'http://schemas.datacontract.org/2004/07/MyDemoNamespace'.. Encountered 'Text' with name '', namespace ''. 

Это партия API третьего, так что я не могу изменить ответ.

ответ

10

Ожидается, что узловой узел ошибки сообщения будет содержать XML. GetDetail десериализует этот XML в данный объект.

Поскольку содержимое не является XML, этот метод можно использовать.

Однако вы можете получить доступ к XML и считывать значение InnerXml:

MessageFault msgFault = ex.CreateMessageFault(); 
var msg = msgFault.GetReaderAtDetailContents().Value; 

Это подошел работал.

+1

Все еще есть проблема, когда ответ содержит угловые скобки [] – John

+0

Решила мою проблему отлично! – eouw0o83hf

+0

этот код, если деталь не является строкой, в порядке: MessageFault msgFault = ex.CreateMessageFault(); XmlReader readerAtDetailContents = msgFault.GetReaderAtDetailContents(); var readOuterXml = readerAtDetailContents.ReadOuterXml(); var data = XElement.Parse (readOuterXml); Словарь element = data.Elements() .ToDictionary (elementKey => elementKey.Name.LocalName, elementVal => elementVal.Value, null); – Jerome2606

1
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 

     if (reply.IsFault) 
     { 
      // Create a copy of the original reply to allow default WCF processing 
      MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
      Message copy = buffer.CreateMessage(); // Create a copy to work with 
      reply = buffer.CreateMessage();   // Restore the original message 

      MessageFault faultex = MessageFault.CreateFault(copy, Int32.MaxValue); //Get Fault from Message 
      FaultCode codigo = faultex.Code; 
      //if (faultex.HasDetail)... //More details 

      buffer.Close(); 
+3

Не могли бы вы также добавить комментарий? – Robert

 Смежные вопросы

  • Нет связанных вопросов^_^