01.02.2021, 17:56 | #1 |
Участник
|
Читать 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 |
Участник
|
Вот пример использования typeof. Может поможет
Ax2009, Reflection, typeof |
|
01.02.2021, 20:35 | #3 |
Участник
|
Цитата:
Body имеет тип System.Object, а не System.Xml.XmlDocument обратите внимание, что даже в примере значение из Body получают через .toString() https://docs.microsoft.com/en-us/dot...g.message.body |
|
04.02.2021, 14:50 | #4 |
Участник
|
Коллеги, спасибо большое за помощь и озвученные предложения.
У меня получилось прочитать следующим образом X++: xmlDocument = new System.Xml.XmlDocument();
xmlDocument.Load(message.get_BodyStream());
strBody = ClrInterop::getAnyTypeForObject(xmlDocument.get_OuterXml()); |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
Теги |
.net, msmq, system.messaging.message |
|
|