AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.11.2009, 15:35   #1  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
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  
dacom is offline
dacom
Участник
 
13 / 10 (1) +
Регистрация: 08.08.2007
А содержимое Основное -> Периодические -> АИФ -> Исключения (Baic->Periodic->AIF->Exceptions) не подходит?
Старый 03.11.2009, 18:20   #3  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Нет не подходит. Ето надо для "наружной" апликации.
Допустим есть код, который в каком то месте "обрывается". Ето как в стандартной ахапте:
X++:
throw error("Some message... example... you dont have enough inventory on hand... etc");
теперь делая/нажимая кнопку в апликации (допустим - wеб), надо чтоб красиво ошибка вывелась. сейчас ето только ввиде "Contact your administrator".... Ето же не нормально, ведь согласитесь?!

У "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  
dacom is offline
dacom
Участник
 
13 / 10 (1) +
Регистрация: 08.08.2007
Есть одна полезная настройка Basic -> Setup -> AIF -> Endpoints -> General -> Propagate errors. Возможно она поможет.
Старый 04.11.2009, 12:47   #5  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Спасибо, помогло... но только выводится последнее сообшение
Насколько понял с етим сталкиваются многие..

Пос суте дела массив сообшений пустой <AifFault::FaultMessageListArray>
когда он их заполняет, черт знает...
Warning/Info скорее всего и не удастья достать ... а надо было бы... что-то типа "Populate InfoLog"
Старый 19.08.2016, 00:04   #6  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Тема актуальная. Может кто нашел решение?
Старый 19.08.2016, 02:01   #7  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Тема актуальная. Может кто нашел решение?
http://axdevnotes.blogspot.co.uk/201...n-message.html

https://dynamicsuser.net/ax/f/develo...er-application
За это сообщение автора поблагодарили: gl00mie (2), MazZzDaI (1).
Старый 19.08.2016, 10:36   #8  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Спасибо!

\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  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Там есть чей-то комментарий к коду что типа нехорошо так делать с точки зрения безопасности так как показываем бизнес-информацию в сообщениях об ошибках. Пидантизм я бы сказал на это, но подумал бы и об этом тоже. Минут 10. И указал бы вопрос доступа в документации. Особливо если меняем глобально и для всех случаев.

С точки зрения разработчика-подрядчика я бы не трогал столь общие места а расширял конкретный контракт. И бог с ним что 20 раз. Зато хлеб.
За это сообщение автора поблагодарили: MazZzDaI (1).
Теги
aif, infolog, сообщение

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dave: AIF Configuration and Additional Findings Blog bot DAX Blogs 1 04.11.2009 17:29
Channel9: Microsoft Dynamics AX 2009 AIF Web Services Screencast Blog bot DAX Blogs 0 17.06.2009 17:05
Dianne Siebold: AIF Top Ten Blog bot DAX Blogs 1 22.04.2008 11:19
Dave: Followup to AIF Configuration Entry Blog bot DAX Blogs 0 28.10.2006 19:01
Pokluda: Outbound web service (AIF) Blog bot DAX Blogs 0 28.10.2006 17:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:27.