我目前正在使用服务引用和生成的 .NET 类与 AX 中的外部 SOAP 服务进行通信。除了如何处理 SOAP 错误之外,一切都很顺利。理想情况下,这不会发生,但有时 SOAP 服务器(我也控制它)会抛出带有“代码”和“消息”的 SOAP 错误。代码及其各自消息的一些示例:
- "INVALID_API_KEY" / "使用了无效的 API 密钥。"
- "INVALID_CUSTOMER_ID" / "传递了无效的客户 ID (%d)"。
这些错误代码是在 WSDL 中定义的,所以当这些错误被抛出时,我可以自然地将一些经过处理的消息传回给用户。不幸的是,我在深入研究 X++ 以确定引发了哪个SOAP 错误时遇到了问题,以便我可以向我的用户显示经过清理的失败解释。目前我的代码如下所示:
try
{
new InteropPermission(InteropKind::ClrInterop).assert();
// ... code making SOAP calls
CodeAccessPermission::revertAssert();
}
catch(Exception::CLRError)
{
warning(AifUtil::getClrErrorMessage());
}
这可以很好地处理 SOAP 错误,它产生的错误如下:“在程序集 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 中键入 'System.ServiceModel.Channels.ReceivedFault' 不是标记为可序列化。”
我已经尝试深入研究基本的 .NET 类,但是用于将 SOAP 错误(类阶梯下的 FaultException)转换为人类可读消息的 ServiceModel(以及随后的)其他类被掩盖了。
谁能给我一些关于如何最好地了解实际故障代码/消息的见解?谢谢!