Сервер IBM MQ кодирует сообщения - PullRequest
0 голосов
/ 07 апреля 2020

Я отправляю XML в очередь IBM MQ, которая содержит раздел CDATA. Этот раздел CDATA содержит следующие специальные символы: $§)#ÜÖ&!^. По какой-то причине они отображаются в очереди MQ как $�)#��&!^. Это приводит к тому, что другой отправитель удаляет его из очереди с этими символами и в результате имеет недопустимую подпись, поскольку сообщения больше не совпадают.

Мы убедились, что сообщение, когда мы делаем .Put(), делает содержит строку XML с этими специальными символами. Я гарантировал, что сообщению присвоено свойство .CharacterSet, которое соответствует тому, что мы в конечном итоге извлечем из очереди.

Какие другие места могут быть автоматически кодировать специальные символы, когда оно помещается в очередь ? Наше приложение находится в среде. NET windows, но сервер MQ находится в поле Linux. Это что-то рассмотреть?

string xmlMsg = "<message><data><![CDATA[<value>$§)#ÜÖ&amp;!^</value>]]</data></message>"; // This is in a CDATA section.
mQMessage = new MQMessage
{
    CharacterSet = 1208,
};

mQMessage.WriteBytes(xmlMsg);

_queue.Put(mQMessage);

1 Ответ

0 голосов
/ 10 апреля 2020

По умолчанию MQ не меняет набор символов вашего сообщения. Таким образом, по умолчанию отправляющие и принимающие приложения несут ответственность за согласование и поддержку набора символов, который подходит обоим.

Вы можете запросить MQ выполнить преобразование набора символов либо в принимающем приложении, когда это вызывает get или на каналах отправителя, когда сообщение передается между администраторами очередей. Но даже если вы запрашиваете преобразование набора символов из MQ, отправляющие приложения по-прежнему обязаны фактически записать данные в сообщение, используя набор символов, который приложение устанавливает в заголовке сообщения MQ.

На основе вашего кода кажется, что ваше отправляющее приложение не использует правильный набор символов, когда оно записывает байты в сообщение. Если вы используете WriteBytes, вам нужно вручную преобразовать строку в байты, используя нужный набор символов.

Я бы предложил вам использовать метод WriteString, который предназначен для использования набора символов, указанного в свойстве CharacterSet :

Метод WriteString преобразует из Unicode в набор символов, закодированный в CharacterSet. Если для CharacterSet установлено значение по умолчанию, MQ C .MQCCSI_Q_MGR, равное 0, преобразование не выполняется, а для CharacterSet установлено значение 1200. Если для CharacterSet задано какое-либо другое значение, WriteString преобразует Unicode в альтернативное значение.

https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.ref.dev.doc/q111220_.htm

И, кстати, для отладки проблем с набором символов вы должны быть очень осторожны, какие инструменты вы используете для проверки сообщения, так как инструмент должен уметь интерпретировать набор символов сообщения. Например, MQ Explorer использует набор символов вашей рабочей станции, на которой вы его запускаете, поэтому он будет показывать каждое сообщение с этим одним набором символов, поэтому он не подходит для устранения этих проблем. Лучше всего получить сообщение из очереди, не спрашивая QM о преобразовании, например, с помощью rfhutil, сохранить его в файл и просмотреть его с помощью шестнадцатеричного редактора.

...