使用 ASCII 编码通过 WebSphere MQ 向 SWIFT 发送消息
Posted
技术标签:
【中文标题】使用 ASCII 编码通过 WebSphere MQ 向 SWIFT 发送消息【英文标题】:Sending a message to SWIFT via WebSphere MQ using ASCII encoding 【发布时间】:2011-09-12 13:08:58 【问题描述】:我正在尝试解决向 SWIFT 网络发送消息的应用程序的问题。该应用程序是一个 .NET 应用程序,它使用 IBM 的 amdqmdnet.dll
程序集与 WebSphere MQ 服务器进行通信。在 WebSphere MQ 服务器上,SWIFT 联盟软件正在运行。
消息从应用程序发送,但不进入 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.
。
我的问题是:如何使用 ASCII 编码将消息发送到 WebSphere MQ 队列?
连接具有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,但我不知道是否需要使用它以及如何使用它。
【问题讨论】:
【参考方案1】:我相信 SWIFT 应用程序在从队列中读取数据后会转换为 ASCII。
那么,你需要做什么:
要么将 ASCII 写入 MQ 消息:更改 .Net 应用程序中的编码以使 'swiftMessage' ASCII 编码。
或将代码集 819 更改为数据实际编码的任何编码,即您所说的 UTF-16,因此代码集 1200。
【讨论】:
我的问题基本上是我应该如何着手并实施您答案的“任一”部分。我知道我需要告诉 WebSphere 对我的字符串进行编码,但是怎么做呢?我不太了解“或”部分。我无法强制外部软件(SWIFT 联盟软件)突然接受 UTF-16 编码的数据。【参考方案2】:对我有用的解决方案是将MQMessage
的CharacterSet
属性设置为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));
但是,我尚未验证这种替代方法是否有效。
【讨论】:
以上是关于使用 ASCII 编码通过 WebSphere MQ 向 SWIFT 发送消息的主要内容,如果未能解决你的问题,请参考以下文章
在 Websphere Application Server 8.5 上运行的 Web 应用程序中的字符编码
“UnicodeEncodeError:‘ascii’编解码器无法编码字符”