#c# #.net #ibm-mq
#c# #.net #ibm-mq
Вопрос:
У меня какая-то странная проблема. Я думаю, что я правильно следовал документации, но мой код не работает. У меня есть этот очень простой жестко запрограммированный тест (NUnit):
[TestFixture]
public class MQQueueTests {
public const string MessageContent = "<test>This is test message</test>";
public static void Main(string[] args) {
var tests = new MQQueueTests();
tests.PutAndGetMessage();
}
[Test]
public void PutAndGetMessage() {
var properties = new Hashtable
{
{MQC.HOST_NAME_PROPERTY, "TestServer"},
{MQC.CHANNEL_PROPERTY, "Test.Channel"},
{MQC.PORT_PROPERTY, 1415},
// Is this correct? It looks like it is not
// enough because adding this line didn't solve
// the problem.
{MQC.CCSID_PROPERTY, 437}
};
using (var manager = new MQQueueManager("Test.Queue.Manager", properties)) {
using (MQQueue queue = manager.AccessQueue("Test.Queue",
MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF)) {
MQMessage message = new MQMessage();
message.WriteUTF(MessageContent);
queue.Put(message);
MQMessage readMessage = new MQMessage();
queue.Get(readMessage);
Assert.AreEqual(MessageContent, readMessage.ReadUTF());
queue.Close();
}
manager.Disconnect();
}
}
}
Я запускаю тестовое приложение либо с консоли, либо через Resharper 6 test runner. Если я запускаю приложение в тестовом режиме, я всегда получаю следующее исключение:
IBM.WMQ.MQException : ошибка MQRC_CHANNEL_CONFIG_ERROR (код причины — 2539)
Исключение генерируется MQQueueManager.Connect
(вызывается его конструктором).
Если я проверяю журналы MQ, я вижу:
AMQ9541: CCSID, предоставленный для преобразования данных, не поддерживается.
ОБЪЯСНЕНИЕ: программа завершилась, потому что либо исходный CCSID ‘437’, либо целевой CCSID ‘852’ недействителен или в настоящее время не поддерживается.
ДЕЙСТВИЕ: исправьте недопустимый CCSID или убедитесь, что запрошенный CCSID может поддерживаться.
Если я запускаю приложение с консоли, я получаю ту же ошибку, но если я изменю кодовую страницу для консоли, вызвав
chcp 437
Мое тестовое приложение работает. Как я могу настроить кодовую страницу из кода?
Ответ №1:
Ну, я нашел обходной путь — он, вероятно, может решить мою проблему, но я не очень доволен этим. Я могу настроить MQCCSID
переменную среды либо глобально, либо путем вызова:
Environment.SetEnvironmentVariable("MQCCSID", "437");
Это настроит кодовую страницу. Тем не менее, я хотел бы использовать свойства нового MQQueueManager
экземпляра для настройки кодовой страницы.
Ответ №2:
Оба эти ответа правильные. Для проекта Windows Forms достаточно установить переменную среды MQCCSID такой же, как ccsid диспетчера очередей, который вы пытаетесь подключить. — 2-е решение
HKEY_LOCAL_MACHINE-> SYSTEM-> CurrentControlSet->Control-> Nls-> Кодовая страница> Значение OEMCP.
у меня было веб-приложение (веб-формы), которое работало только со 2-м решением
Ответ №3:
измените язык вашей системы на английский (США) в Windows 7 Региональные настройки -> Администрирование-> Изменить язык системы. также после этого вы можете проверить это в значении regedit. regedit->HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Control->Nls->Проверка значения OEMCP на кодовой странице.