gpt4 book ai didi

.net - SOAP 故障消息中的多个 namespace 导致FaultException反序列化失败

转载 作者:行者123 更新时间:2023-12-02 09:00:44 25 4
gpt4 key购买 nike

我们正在连接到一个 Web 服务,并且我们返回的错误消息根本没有反序列化,并且我可以制作的类版本都无法正确反序列化。我们无法控制服务器端的事情。服务器不允许发现,因此将 ?WSDL 添加到端点 URL 的末尾会导致错误,而不是 WSDL。

[Fiddler][1] 显示返回的故障消息如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:eGov="http://eGov.gov" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>Client</faultcode>
<faultstring/>
<detail>
<eGov:eGov2Exception>
<eGov:ErrorClassification>SOME_ERROR</eGov:ErrorClassification>
<eGov:ErrorCode>SOME_ERROR_CODE</eGov:ErrorCode>
<eGov:ErrorMessage>Your request was unsuccessful. blah blah blah.</eGov:ErrorMessage>
</eGov:eGov2Exception>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>

然而,当我们尝试使用以下方法捕获它时,我们创建的任何类(尝试 xsd.exe、svcutil 和其他类,包括我们从头开始编写的代码)都无法反序列化它:

catch (FaultException<eGov2ExceptionType> exp)
{
// Never stops here.
}
catch (FaultException<AllOtherAttemptedClasses> exp)
{
// Never stops here.
}
catch (SoapException se)
{
// Never stops here.
}
catch (FaultException exp)
{
//Always gets caught here.
}

只会调用基本的FaultException catch,这意味着我们会丢失正在发送的FaultMessage 的内容。我编写的一些类的序列化与上面的示例非常接近,但无法反序列化它,因此我们怀疑存在命名空间问题。

问题:

1 - 你会怎么写这个?

2 - 这是 WCF 的常见错误/问题吗?

[1]:http://www.fiddler2.com/fiddler2/ fiddler

最佳答案

我们最终所做的是放弃 try catch 故障并将其传回 SOAP channel 。相反,我们创建了一个自定义异常,并连接了一个 MessageInspector 来监视错误并将其作为异常抛出。

(已清理的)代码的相关部分:

   public void AfterReceiveReply(ref Message reply, object correlationState)
{
if (reply.IsFault)
{
XmlDictionaryReader xdr = reply.GetReaderAtBodyContents();
XNode xn = XDocument.ReadFrom(xdr);
string s = xn.ToString();
XDocument xd = XDocument.Parse(s);
XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace ns = "http://eGov.gov";
XElement xErrorClass = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorClassification");
XElement xErrorCode = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorCode");
XElement xErrorMessage = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorMessage");

throw new eGovException(xErrorClass.Value, xErrorCode.Value, xErrorMessage.Value);
}
}

主应用程序然后使用:

catch (eGovException ex)
{
//在这里处理异常。
}

在尝试更正 namespace 方面浪费了太多时间。谢谢回答。

关于.net - SOAP 故障消息中的多个 namespace 导致FaultException反序列化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1441647/

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