这个answer解释了如何获取SOAP FaultException
的文本,但只有当内容是序列化字符串时才会生效,从而产生<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">details</string>
。
此ONVIF设备设计器使用SOAP <env:Text>
元素,该元素无法反序列化为字符串。
如何阅读以下FaultException
的详细信息?
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:enc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:rpc="http://www.w3.org/2003/05/soap-rpc" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<env:Header>
<wsa:Action>http://www.w3.org/2005/08/addressing/soap/fault</wsa:Action>
</env:Header>
<env:Body>
<env:Fault>
<env:Code>
<env:Value>env:Receiver</env:Value>
<env:Subcode>
<env:Value>ter:Action</env:Value>
</env:Subcode>
</env:Code>
<env:Reason>
<env:Text xml:lang="en">ActionFailed</env:Text>
</env:Reason>
<env:Detail>
<env:Text>It is not possible to operate because of the unsupported video source mode.</env:Text>
</env:Detail>
</env:Fault>
</env:Body>
</env:Envelope>
此代码来自上面的链接答案:
} catch (FaultException ex) {
System.ServiceModel.Channels.MessageFault mf = ex.CreateMessageFault();
if (mf.HasDetail) {
string detailedMessage = mf.GetDetail<string>();
output.OutputText(detailedMessage);
}
}
哪个失败了:
类型的例外 &#39; System.Runtime.Serialization.SerializationException&#39;发生在 System.Runtime.Serialization.dll但未在用户代码中处理
其他信息:期待元素&#39;字符串&#39;从命名空间 &#39; http://schemas.microsoft.com/2003/10/Serialization/&#39; ..遇到了 &#39;元素&#39;名称&#39;文字&#39;,名称空间 &#39; http://www.w3.org/2003/05/soap-envelope&#39;
必须有内置的反序列化器,因为<env:Reason>
元素使用相同的节点。
答案 0 :(得分:1)
您可以将详细信息作为&#34; raw&#34; XmlElement
:
System.ServiceModel.Channels.MessageFault mf = ex.CreateMessageFault();
if (mf.HasDetail) {
System.Xml.XmlElement detailedMessage = mf.GetDetail<System.Xml.XmlElement>();
System.Diagnostics.Trace.WriteLine("Detail: " + detailedMessage.InnerText);
}
只有当你知道内容是什么时才会使用它,除非包含在try { } catch { }
块中