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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.02.2021, 17:56   #1  
johny77 is offline
johny77
Участник
 
31 / 27 (1) +++
Регистрация: 04.07.2006
Читать MSMQ из АХ2009
Добрый день всем!
Система AX2009. Есть необходимость читать и писать в Microsoft Messaging Queue (MSMQ). После разворачивание на локальной машине получилось писать (send). Но прочитать не получается, ошибка при вызове метода message.get_Body().
Подскажите, как можно преобразовывать типы использую .net? Может у кого-нибудь есть рабочий пример для чтения? Спасибо большое за помощь.
X++:
static void MSMQ_sendAndRecieveMSMQ(Args _args)
{
    System.Xml.XmlDocument          xmlDocument;
    System.Xml.XmlElement           xmlElement, xmlElementStatus;
    System.Xml.XmlNode              xmlNode;
    
    System.Exception                clrException;
    System.String                   clrString;
    System.IO.StreamWriter          streamWriter;
    System.Messaging.MessageQueue   messageQueue;
    System.Messaging.Message        message;
    System.Messaging.MessageQueueException          exception;
    System.Messaging.MessageQueueTransaction        transaction;
    Microsoft.Dynamics.IntegrationFramework.Adapter.FileSystem          fileSystem;
    Microsoft.Dynamics.IntegrationFramework.Adapter.TransportMessage    transportMessage;
    Str                             strBuf;
    ;
    #define.testString(@'.\private$\test')
    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();

        if (System.Messaging.MessageQueue::Exists(#testString))
        {
            // SEND
            strBuf  = '<Response stamp="2021-01-22T17:28:09.041Z">'
                    + '<Status id="575064" com="1"/>'
                    + '<Status id="575063" com="0">Текст ошибки </Status>'
                    + '<Status id="575070" com="1"/>'
                    + '</Response>';
            xmlDocument = new System.Xml.XmlDocument();
            xmlDocument.LoadXml(strBuf);

            messageQueue = new System.Messaging.MessageQueue(#testString);

            message = new System.Messaging.Message();
            message.set_Label('AX response');
            message.set_Body(xmlDocument);
            message.set_Formatter(new System.Messaging.XmlMessageFormatter());

            messageQueue.Send(message, 'axapta', System.Messaging.MessageQueueTransactionType::Automatic);
            info(strfmt("Message %1 sent", any2str(CLRInterop::getAnyTypeForObject(message.get_Id()))));

            messageQueue.Dispose();
            message.Dispose();


            // SEND
            messageQueue = new System.Messaging.MessageQueue(#testString);
            // как С# адоптировать под Х++ то что фигурных скобках
            // messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            message = messageQueue.Receive(new System.TimeSpan(0, 0, 10));
            if (message)
            {
                //message.set_Formatter(new System.Messaging.XmlMessageFormatter());
                // ERROR: Target type array is missing. The target type array must be set in order to deserialize the XML-formatted message.
                xmlDocument = message.get_Body();
                
                // ERROR: Cannot find a formatter capable of reading this message
                // clrString = message.get_Body();

                info( strfmt("Message %1 receive", any2str(CLRInterop::getAnyTypeForObject(message.get_Id()))));
            
            }
            messageQueue.Dispose();
            if (message)
                message.Dispose();
        }
        else
        {
            warning(strfmt("Очередь %1 не найдена", #testString));
        }
    }
    catch(Exception::CLRError)
    {
        clrException = CLRInterop::getLastException();

        if (clrException)
        {
            clrException = clrException.get_InnerException();
            if (clrException)
            {
                error(clrException.get_Message());
            }
        }
    }
    catch(Exception::CLRError)
    {
        //info("An error occurred");
        error(AifUtil::getClrErrorMessage());

    }
    CodeAccessPermission::revertAssert();
}
Старый 01.02.2021, 20:21   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вот пример использования typeof. Может поможет
Ax2009, Reflection, typeof
Старый 01.02.2021, 20:35   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от johny77 Посмотреть сообщение
Но прочитать не получается, ошибка при вызове метода message.get_Body().
get_Body() - это аксаптовский способ обратиться к property Body

Body имеет тип System.Object, а не System.Xml.XmlDocument

обратите внимание, что даже в примере значение из Body получают через .toString()
https://docs.microsoft.com/en-us/dot...g.message.body
__________________
полезное на axForum, github, vk, coub.
Старый 04.02.2021, 14:50   #4  
johny77 is offline
johny77
Участник
 
31 / 27 (1) +++
Регистрация: 04.07.2006
Коллеги, спасибо большое за помощь и озвученные предложения.

У меня получилось прочитать следующим образом
X++:
            xmlDocument = new System.Xml.XmlDocument();
            xmlDocument.Load(message.get_BodyStream());
            strBody = ClrInterop::getAnyTypeForObject(xmlDocument.get_OuterXml());
За это сообщение автора поблагодарили: sukhanchik (2).
Теги
.net, msmq, system.messaging.message

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Начисление отпуска за счет резерва АХ2009 ksenia DAX: Функционал 0 07.10.2016 11:13
«Метка» для сообщения AIF MSMQ в Dynamics AX 2009 LRA DAX: Программирование 3 17.10.2012 16:53
Стоимость перехода с AX3.0 на АХ2009 Pustik DAX: Прочие вопросы 18 30.03.2011 16:21
emeadaxsupport: Creating an MSMQ message that can be consumed by AX AIF process Blog bot DAX Blogs 0 26.04.2010 19:05
Работа с MSMQ Dimonishe DAX: Программирование 6 04.04.2007 15:19

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

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

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