2016-05-17 3 views
1

Я видел несколько других сообщений здесь с той же проблемой, но никто не предлагает решения. И что странно, так это то, что это работает в dev, но не в prod.Невозможно де-сериализовать сообщение.Body при чтении из MSMQ

Я подаю сообщение в очередь следующим образом:

public void QueueMessage(LeadSubmissionMessage message) 
    { 
     using (var queue = new MessageQueue(MessageQueuePath)) 
     { 
      queue.DefaultPropertiesToSend.Recoverable = true; // always send as recoverable 
      queue.Send(message); 
     } 
    } 

Это класс LeadSubmissionMessage:

[Serializable] 
public class LeadSubmissionMessage 
{ 
    public long LeadId { get; set; } 
    public long UserId { get; set; } 
    public DateTime DateTime { get; set; } 
} 

Это сообщение, в сыром тексте:

<?xml version="1.0"?> 
<LeadSubmissionMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <LeadId>194018</LeadId> 
    <UserId>300</UserId> 
    <DateTime>2016-05-17T14:52:30.1484784Z</DateTime> 
</LeadSubmissionMessage> 

Что все работает нормально. Но на приемном конце, и только в производстве, когда мы делаем это:

body = message.Body; 

Он бросает эту ошибку:

System.InvalidOperationException: Cannot deserialize the message passed as an argument. Cannot recognize the serialization format. 
at System.Messaging.XmlMessageFormatter.Read(Message message) 
at System.Messaging.Message.get_Body() 

Он работает найти в Dev и постановщики. Я пытаюсь свести к минимуму и устранить те моменты, когда все может быть по-другому, но у меня не хватало вещей, чтобы проверить. Все они работают с одной и той же версией сборки (выпуск). Любые связанные с MSMQ ключи конфигурации совпадают (за исключением очевидных имен и местоположений очереди). Одним из возможных вариантов является версия MSMQ, установленная на машине? Но я не уверен, как это проверить. Будет ли ОС иметь значение? Не могу себе это представить.

+0

Я предполагаю, что тело является частью сообщения HTML. Таким образом, есть проблемы с html-частью сообщения. Могут быть проблемы с файлами cookie или прокси-сервера. Я бы начал с использования сниффера, как скрипач, чтобы увидеть, где происходит сбой передачи. Сравните хорошие результаты с плохими и проверьте заголовки HTTP на различия. – jdweng

+0

Message.Body не является частью сообщения HTML. Это пример LeadSubmissionMessage. (Код класса в OP.) В этом случае Fiddler не поможет. –

+0

Можете ли вы выделить, что это единственное сообщение в очереди? Кроме того, может ли быть какое-либо несоответствие между типом, как определено отправителем, и как определено получателем? –

ответ

1

Я использую его следующим образом:

private static MyMessage RecieveMessage() 
{ 
    if (!MessageQueue.Exists(QueueName)) 
    { 
     return null; 
    } 

    using (var msmq = new MessageQueue(QueueName)) 
    { 
     msmq.Formatter = new XmlMessageFormatter(new Type[] { typeof(MyMessage) }); 
     var message = msmq.Receive(); 
     return message != null && message.Body is MyMessage ? (MyMessage)message.Body : null; 
    } 
} 

Не уверен, что проблема в вашем случае, но вы могли бы попытаться сделать его похожим на мой подход и посмотреть, если он работает для вас.