gpt4 book ai didi

c# - 没有定义故障契约时,如何访问 SOAP 故障中的 部分?

转载 作者:行者123 更新时间:2023-11-30 18:31:17 24 4
gpt4 key购买 nike

我正在使用 WCF 连接到业务合作伙伴的 Web 服务。 Web 服务没有定义的故障契约(Contract) - 没有 <wsdl:fault> WSDL 中的元素。

当发生故障时,我会得到这样的响应(为了可读性而修剪命名空间):

<s:Envelope>
<s:Body>
<Fault>
<faultcode>xxx</faultcode>
<faultstring>Business data error</faultstring>
<detail>
<Error>
<ErrorCode>xxx</ErrorCode>
<ErrorDescription>xxx</ErrorDescription>
</Error>
</detail>
</Fault>
</s:Body>
</s:Envelope>

在我的代码中,我可以像这样捕获异常:

try
{
proxy.DoWork();
}
catch(FaultException fex)
{
...
}

但是因为没有定义的 FaultContract 我不能使用基于泛型的 FaultException (如 catch(FaultException<myFaultType>) )。

长话短说,我需要能够检查 <ErrorCode><ErrorDescription> <Error> 中的元素catch 中的 SOAP 错误中返回的元素以上。

谢谢

最佳答案

您可以使用响应示例通过命令 xsd 生成架构:

// xsd foo.xml
<s:Envelope xmlns:s="foo.com">
<s:Body>
<Fault>
<faultcode>xxx</faultcode>
<faultstring>Business data error</faultstring>
<detail>
<Error>
<ErrorCode>xxx</ErrorCode>
<ErrorDescription>xxx</ErrorDescription>
</Error>
</detail>
</Fault>
</s:Body>

然后,您可以使用相同的命令生成序列化类:

// xsd foo.xsd /c
...
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="foo.com")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="foo.com", IsNullable=false)]
public partial class Envelope {
...

也许您必须编辑类 foo.c 的某些属性,但我认为这应该可行。

关于c# - 没有定义故障契约时,如何访问 SOAP 故障中的 <detail> 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20433627/

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