gpt4 book ai didi

c# - 如何获取非类型化 FaultException 的详细信息?

转载 作者:太空狗 更新时间:2023-10-29 23:39:32 24 4
gpt4 key购买 nike

我正在使用 C# 从 .NET 4.5 调用 SOAP Web 服务,但我不明白如何捕捉未类型化 FaultException 的详细信息.

如果 Web 服务遇到错误,我会收到如下消息:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
<faultcode>GSX.SYS.003</faultcode>
<faultstring>Multiple error messages exist. Please check the detail section.</faultstring>
<detail>
<operationId>HqrCoRMbtKczWFH2WMuFJGe</operationId>
<errors>
<error>
<code>ENT.UPL.005</code>
<message>User ID is required for authentication.</message>
</error>
<error>
<code>ENT.UPL.005</code>
<message>Password is required for authentication.</message>
</error>
<error>
<code>ENT.UPL.005</code>
<message>Sold-To is required for authentication.</message>
</error>
</errors>
</detail>
</S:Fault>
</S:Body>
</S:Envelope>

为了捕获错误,我将调用包装在 try/catch block 中并捕获 FaultException :

try
{
// Do something.
}
catch (FaultException faultException)
{
var messageFault = faultException.CreateMessageFault();
// ???
throw;
}

问题出在// ???行:如何访问 FaultException 的详细信息,因为我不能使用 messageFault.GetDetail<T>()因为详细信息未键入?

对于代码和我没有问题的原因,我用 messageFault.Code.Name 得到它们和 messageFault.Reason.Translations.Single().Text .

我能够编造的是:

var stringWriter = new StringWriter();
var xmlTextWriter = new XmlTextWriter(stringWriter);
var messageFault = faultException.CreateMessageFault();
messageFault.WriteTo(xmlTextWriter, EnvelopeVersion.Soap12);
var stringValue = Convert.ToString(stringWriter);
var nameTable = new NameTable();
var xmlNamespaceManager = new XmlNamespaceManager(nameTable);
xmlNamespaceManager.AddNamespace("soap", "http://www.w3.org/2003/05/soap-envelope");
var xmlDocument = XDocument.Parse(stringValue);
var operationId =
xmlDocument
.XPathSelectElement("/soap:Fault/soap:Detail/operationId", xmlNamespaceManager)
.Value;
var errors =
xmlDocument
.XPathSelectElements("/soap:Fault/soap:Detail/errors/error", xmlNamespaceManager)
.Select(element => new
{
Code = element.XPathSelectElement("code").Value,
Message = element.XPathSelectElement("message").Value
})
.ToArray();

但撇开空引用和编码问题不谈,它就是一个怪物。

必须有一种更明智的方式来获取详细信息。

最佳答案

您可以阅读 XML 类型的详细信息,例如。 XElementXmlElement并使用 XPath、Linq to XML 处理它或将其视为字符串。

在类似的情况下,我使用以下代码获取公认简单的 details 元素的内容:

var detail = fault.GetDetail<XElement>();
return detail.Value;

关于c# - 如何获取非类型化 FaultException 的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com