2016-05-17 6 views
1

同じ問題でいくつかの他の投稿を見ましたが、解決策はありません。そして本当に奇妙なのは、devで動作するが、prodでは動作しないということです。MSMQからの読み込み時にMessage.Bodyを逆シリアル化できません

次のように私は、キューにメッセージを送信しています:

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> 

それはすべて正常に動作します。しかし、受信側で、かつ唯一の生産では、我々が行う場合は、この:

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() 

それはデベロッパーとステージングで見つける作品:

body = message.Body; 

それは、このエラーがスローされます。私は物事が異なる可能性がある点を最小限に抑え、排除しようとしていますが、チェックすることがなくなってしまいました。彼らはすべて同じビルドバージョン(リリース)を実行しています。すべてのMSMQ関連の設定キーが一致します(明白なキュー名と場所を除く)。可能な変形の1つは、マシンにインストールされているMSMQのバージョンです。しかし、私はそれを確認する方法がわかりません。 OSは違いをもたらすだろうか?それは想像できません。

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; 
    } 
} 

わからないあなたの場合の問題点ものですが、あなたは私のアプローチと、それは似て作り、それはあなたのために働いているかどうかを確認しようとすることができます:

+0

本文がHTMLメッセージの一部であると仮定します。だから、メッセージのhtml部分に問題があります。 Cookieまたはプロキシサーバーに問題がある可能性があります。私は転送が失敗している場所を見るために、フィドラーのようなスニファを使用することから始めます。良い結果と悪いものを比較し、httpヘッダーで違いを確認してください。 – jdweng

+0

Message.BodyはHTMLメッセージの一部ではありません。それはLeadSubmissionMessageのインスタンスです。 (OPのクラスコード)この場合、Fiddlerは役に立たないでしょう。 –

+0

キュー内の唯一のメッセージであることが分かりますか?また、送信者によって定義されたタイプと受信者によって定義されたタイプの間に不一致があってもかまいませんか? –

答えて

1

私は、次の方法でそれを使用しています。

関連する問題