Добрый день всем!
Система 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();
}