Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';从MSMQ读取时对消息.Body进行反序列化_C#_.net_Serialization_Msmq - Fatal编程技术网

C# Can';从MSMQ读取时对消息.Body进行反序列化

C# Can';从MSMQ读取时对消息.Body进行反序列化,c#,.net,serialization,msmq,C#,.net,Serialization,Msmq,我在这里看到过其他几个帖子也有同样的问题,但没有一个能提供解决方案。真正奇怪的是,这在dev中有效,但在prod中无效 我正在向队列提交一条消息,如下所示: public void QueueMessage(LeadSubmissionMessage message) { using (var queue = new MessageQueue(MessageQueuePath)) { queue.DefaultPropertiesT

我在这里看到过其他几个帖子也有同样的问题,但没有一个能提供解决方案。真正奇怪的是,这在dev中有效,但在prod中无效

我正在向队列提交一条消息,如下所示:

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

它在Dev和Staging中工作。我试图最小化和消除事情可能不同的地方,但我已经没有东西要检查了。它们都运行相同的构建版本(版本)。任何与MSMQ相关的配置键都匹配(除了明显的队列名称和位置)。一种可能的变化是机器上安装的MSMQ版本?但我不知道该怎么检查。操作系统会有所不同吗?无法想象它会这样。

我用以下方式使用它:

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

不确定您的问题出在哪里,但您可以尝试与我的方法类似,看看它是否适合您。

我假设正文是HTML消息的一部分。因此,消息的html部分存在问题。可能是cookie或代理服务器问题。首先,我会使用类似fiddler的嗅探器来查看传输失败的地方。比较好的结果和坏的结果,并检查http头的差异。Message.Body不是HTML消息的一部分。这是LeadSubmissionMessage的一个实例。(OP中的类代码)在这种情况下,Fiddler不会有帮助。您能确定它是队列中唯一的消息吗?此外,发送方定义的类型与接收方定义的类型之间是否存在任何不匹配?同一队列用于各种类型的消息,同一流程提取所有消息,然后根据类型将其交给处理程序。真正奇怪的是,这在Dev和Staging中有效,但在prod中失败。我想我要重新推到prod的新版本。这是我所能想到的。凯西:这是通过windows操作系统传递的隧道消息吗?
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;
    }
}