Отправка сообщения в SWIFT через WebSphere MQ с использованием кодировки ASCII
Я пытаюсь решить проблему с приложением, которое отправляет сообщение в сеть SWIFT. Приложение представляет собой приложение.NET и использует IBM amdqmdnet.dll
сборка для связи с сервером WebSphere MQ. На сервере WebSphere MQ работает программное обеспечение SWIFT Alliance.
Сообщения отправляются из приложения, но не входит в сеть SWIFT. Некоторое расследование выявило следующее сообщение об ошибке:
MQSeries Queue 'MQSWIFT/SWIFT.SENDER', Nbr 123, Session 4567, Sequence 890, Conversion error (From)
MQ Msg Id : AMQ MQSWIFT <XX><XX><XX>X <X>-<XX>
Message Info : Error in FIN block 1: can not find tag F01 in message
{.1.:.F.0.1. (rest of message removed)
Начало отправленного сообщения {1:F01
и для меня это выглядит так, как будто сообщение закодировано в UNICODE (UTF-16), но программное обеспечение SWIFT ожидает ASCII. Программное обеспечение SWIFT видит {.1.:.F.0.1.
,
У меня вопрос: как отправить сообщение в очередь WebSphere MQ с использованием кодировки ASCII?
Соединение имеет свойства MQC.TRANSPORT_PROPERTY
, MQC.HOST_NAME_PROPERTY
а также MQC.CHANNEL_PROPERTY
задавать.
Очередь открывается с помощью опций MQC.MQOO_OUTPUT
а также MQC.MQOO_FAIL_IF_QUIESCING
,
Сообщение создано в формате MQC.MQFMT_STRING
и варианты сообщений по умолчанию:
var mqMessage = new MQMessage { Format = MQC.MQFMT_STRING };
mqMessage.WriteString(swiftMessage);
var mqMessageOptions = new MQPutMessageOptions();
queue.Put(mqMessage, mqMessageOptions);
Я заметил, что MQC
перечисление имеет значение CODESET_819
что, вероятно, относится к ASCII, но я понятия не имею, нужно ли мне его использовать и как.
2 ответа
Решение, которое работало для меня, состояло в том, чтобы установить CharacterSet
собственность MQMessage
в 819
:
var mqMessage = new MQMessage {
Format = MQC.MQFMT_STRING,
CharacterSet = 819
}
mqMessage.WriteString(swiftMessage);
Коллеги также сказали мне, что я должен быть в состоянии использовать MQMessage.Write
перегрузка, которая принимает байтовый массив. Что-то вроде этого:
var mqMessage = new MQMessage();
mqMessage.Write(Encoding.ASCII.GetBytes(swiftMessage));
Однако я не проверял, работает ли этот альтернативный подход.
Я считаю, что приложение SWIFT преобразует в ASCII после того, как оно читает из очереди.
Итак, что вам нужно сделать:
Либо запишите ASCII в сообщение MQ: Измените кодировку в своем приложении.Net, чтобы сделать кодировку ASCII "swiftMessage".
Или измените кодовый набор 819 на тот, который на самом деле кодирует данные, и вы говорите, что это UTF-16, так что это будет кодовый набор 1200.