03.11.2009, 15:35 | #1 |
Участник
|
AIF: как вернуть ошибки/инфолог из ахапты?
Делаем портал/пример через AIF.
Надо сделать так, чтобы были видны все инфологи с его статусами (Warning/Error) и соответственно try/catch чтоб сработал.. Делаю специально throw error, смотрю в апликации - есть только ошибка об фатальной ошибке - ака "Смотрите в логе..." Как и можно ли вообсче "разговаривать" с Ахаптой по AIF на уровне инфолога? X++: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> - <s:Body> - <s:Fault> <faultcode>s:Client</faultcode> <faultstring xml:lang="en-US">Request Failed. See the Exception Log for details.</faultstring> - <detail> - <AifFault xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Fault" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <CustomDetailXml i:nil="true" /> <FaultMessageListArray i:nil="true" /> </AifFault> </detail> </s:Fault> </s:Body> </s:Envelope> |
|
03.11.2009, 17:37 | #2 |
Участник
|
А содержимое Основное -> Периодические -> АИФ -> Исключения (Baic->Periodic->AIF->Exceptions) не подходит?
|
|
03.11.2009, 18:20 | #3 |
Участник
|
Нет не подходит. Ето надо для "наружной" апликации.
Допустим есть код, который в каком то месте "обрывается". Ето как в стандартной ахапте: X++: throw error("Some message... example... you dont have enough inventory on hand... etc"); У "AIF->SOAP->EP->.NET Business Connector" цепожки ето вообше в IIS заголовке как "HTTP/500 Server internal Error"... и дальше SOAP пакет с етим текстом "Request Failed. See the Exception Log for details."... PS: ето я с "снифером" HTTP (SOAP) пакеты просканировал... Последний раз редактировалось Delfins; 03.11.2009 в 18:24. |
|
03.11.2009, 19:02 | #4 |
Участник
|
Есть одна полезная настройка Basic -> Setup -> AIF -> Endpoints -> General -> Propagate errors. Возможно она поможет.
|
|
04.11.2009, 12:47 | #5 |
Участник
|
Спасибо, помогло... но только выводится последнее сообшение
Насколько понял с етим сталкиваются многие.. Пос суте дела массив сообшений пустой <AifFault::FaultMessageListArray> когда он их заполняет, черт знает... Warning/Info скорее всего и не удастья достать ... а надо было бы... что-то типа "Populate InfoLog" |
|
19.08.2016, 00:04 | #6 |
Участник
|
Тема актуальная. Может кто нашел решение?
|
|
19.08.2016, 02:01 | #7 |
Banned
|
|
|
|
За это сообщение автора поблагодарили: gl00mie (2), MazZzDaI (1). |
19.08.2016, 10:36 | #8 |
Участник
|
Спасибо!
\Classes\AifRequestProcessor\handleProcessingException X++: static private AifXml handleProcessingException(AifMessage message, AifInfoLog aifInfoLog) { SysExceptionLog exceptionLog; AifXml faultXml; AifMessage originalMessage; //<#AIF infolog fix> str infoLogStr(InfologData _infologData) { str ret; SysInfoLogEnumerator infoLogEnum = SysInfoLogEnumerator::newData(_infologData); SysInfologMessageStruct infoMessageStruct; ; while(infoLogEnum.moveNext()) { infoMessageStruct = SysInfologMessageStruct::construct(infoLogEnum.currentMessage()); if (ret) { ret += '\r\n'; } ret += strFmt('%1: %2', infoMessageStruct.preFixTextElement(infoMessageStruct.prefixDepth()), infoMessageStruct.message()); } return ret; } //</#AIF infolog fix> // We have to get the faultXml first, otherwise doing a infolog.cut() will clear // the fault object from infolog. //<#AIF infolog fix> //if( message && AifEndpoint::propagateErrors(message.sourceEndpointId()) ) //{ // faultXml = AifFault::faultXml(aifInfoLog.getLastMessage()); //} //else //{ // faultXml = AifFault::faultXml("@SYS94277"); //} faultXml = AifFault::faultXml(infoLogStr(aifInfoLog.getInfoLogData())); //</#AIF infolog fix> //Write entries to the Exception Log exceptionLog = new SysExceptionLog(); exceptionLog.writeInfoLogData(strfmt("@SYS95172"), aifInfoLog.getInfoLogData()); aifInfoLog.clearLast(); // Set message status to Error if not processed yet // The message will exist only if the message has been created, if // any exception was thrown from processInboundMessage() before the message was created, // the below call (AifMessageManager::update()) will fail, so we have additional check here. if( message && message.messageId() && (!AifMessageManager::isNewMessage(message.messageId()))) { originalMessage = AifMessageManager::read(message.messageId()); // If message in already in processed or error state, then leave it as is. if ((originalMessage.status() != AifMessageStatus::Processed) && (originalMessage.status() != AifMessageStatus::Error)) { originalMessage.status(AifMessageStatus::Error); AifMessageManager::update(originalMessage, classstr(AifRequestProcessor), true); } } return faultXml; } |
|
19.08.2016, 19:15 | #9 |
Banned
|
Там есть чей-то комментарий к коду что типа нехорошо так делать с точки зрения безопасности так как показываем бизнес-информацию в сообщениях об ошибках. Пидантизм я бы сказал на это, но подумал бы и об этом тоже. Минут 10. И указал бы вопрос доступа в документации. Особливо если меняем глобально и для всех случаев.
С точки зрения разработчика-подрядчика я бы не трогал столь общие места а расширял конкретный контракт. И бог с ним что 20 раз. Зато хлеб. |
|
|
За это сообщение автора поблагодарили: MazZzDaI (1). |