Отправка сообщения в 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.

Другие вопросы по тегам