В настоящее время я общаюсь с внешней службой SOAP в AX, используя ссылку на службу и сгенерированный класс .NET. Все работает отлично, за исключением того, как обрабатывать ошибки SOAP. В идеале этого не происходит, но иногда SOAP-сервер (который я тоже контролирую) выдает ошибку SOAP с «кодом» и «сообщением». Некоторые примеры кодов и соответствующих сообщений:
- "INVALID_API_KEY" / "Использован неверный ключ API."
- "INVALID_CUSTOMER_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.Channels.ReceivedFault "в сборке" System.ServiceModel, Версия = 3.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 'не помечен как сериализуемый. "
Я пытался развернуть базовые классы .NET, но ServiceModel (и впоследствии) другие классы для преобразования ошибки SOAP (FaultException вниз по лестнице классов) в удобочитаемое сообщение скрыты.
Может ли кто-нибудь дать мне некоторое представление о том, как лучше узнать фактический код ошибки / сообщение? Спасибо!