如何通过在.net中提供FaultException的TDetail来提取异常的详细信息



SOAP请求的响应是以下xml输出。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring xml:lang="en">INVALID_REQUEST - Request is not a valid for XSD rules.</faultstring>
<detail>
<ServiceError xmlns="http://test.test.com/xmlschema/common">
<code>INVALID_REQUEST</code>
<description>Request is not a valid for XSD rules.</description>
<details>cvc-datatype-valid.1.2.1: '?' is not a valid value for 'integer'.</details>
<details>cvc-type.3.1.3: The value '?' of element 'pos:userId' is not valid.</details>
</ServiceError>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body></SOAP-ENV:Envelope>

在尝试用FaultException捕获此错误时,我创建了ServiceError类,如下所示,并将其作为FaultException的TDetail。然而,我无法了解这个错误的细节。它根本没有进入挡块。我哪里出了问题,或者有你推荐的方法吗?

try{
//here is the code where i got the error
}
catch (FaultException<ServiceError> e)
{
}

[DataContract]
public class ServiceError
{
[DataMember]
public string code { get; set; }
[DataMember]
public string description { get; set; }
[DataMember]
public string[] details { get; set; }
}

您可以尝试以下方法,消息失败的详细信息节点应包含XML
GetDetail将此XML反序列化为给定的对象。有关详细信息,您可以查看此帖子。
内容是一个字符串,代码:

catch (FaultException ex)
{
MessageFault msgFault = ex.CreateMessageFault();
var msg = msgFault.GetReaderAtDetailContents().Value;
//throw Detail
}

如果详细信息不是字符串,则代码:

MessageFault msgFault = ex.CreateMessageFault();
XmlReader readerAtDetailContents = msgFault.GetReaderAtDetailContents();
var readOuterXml = readerAtDetailContents.ReadOuterXml(); 
var data = XElement.Parse(readOuterXml);
Dictionary<string, string> element = data.Elements().ToDictionary(elementKey => elementKey.Name.LocalName, elementVal => elementVal.Value, null);

最新更新