невозможно прочитать сериализованные данные как тело сообщения в msmq c # 3.0 - PullRequest
1 голос
/ 14 апреля 2010

Это мой метод для отправки сообщения в приват Q

using (MessageQueue msgQ = new MessageQueue(MessageQueueName))
        {
            using (System.Messaging.Message newMessage = new System.Messaging.Message(MessageBody,
                new System.Messaging.ActiveXMessageFormatter()))
            {
                newMessage.Label = MessageLabel;
                newMessage.Priority = Priority;
                msgQ.Send(newMessage);
            }

        }

У меня есть объект заказа, который я сериализую и отправляю как тело сообщения. Сериализованный объект -

<?xml version="1.0"?>
<OrderInfo>
    <OrderID>11111</OrderID>
    <OrderDetails>
        <LineItem>
            <ProductDetails>
                <Name>qwqwqw</Name>
                <Manufacturer>asasas</Manufacturer>
                <UPC>12222222222</UPC>
                <sku>2132</sku>
                <Price>12.21</Price>
            </ProductDetails>
            <Quantity>1</Quantity>
        </LineItem>
    </OrderDetails>
</OrderInfo>

Это мой метод получения этого сообщения в службе Windows

 void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs asyncResult)
{
    // Connect to the queue.
    MessageQueue mq = (MessageQueue)sender;

    // End the asynchronous Receive operation.
    Message m = mq.EndReceive(asyncResult.AsyncResult);

    m.Formatter = new System.Messaging.ActiveXMessageFormatter()

    //Get Filedata from body
    OrdrInfo qMessage = (OrdrInfo)XMLUtil.Deserialize(m.Body.ToString(), typeof(OrdrInfo));

}

когда я пытаюсь взглянуть на m.Body в QuickWatch это то, что он заявляет

m.Body.Message = Не удается найти средство форматирования, способное прочитать это сообщение.

m.Body.StackTrace = at System.Messaging.Message.get_Body ()

1 Ответ

3 голосов
/ 06 октября 2010

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

Поскольку никто не ответил, вот один ответ, который я только что нашел где-то еще (спасибо TechRepublic ). В этом коде предполагается, что «MyType» является типичным базовым сообщением, которое можно прочитать с помощью XML-сериализации - это означает, что оно помечено как сериализуемое, а все данные, подлежащие отправке / восстановлению, находятся в открытых свойствах get / set.

Код:

MessageQueue msgQ = new MessageQueue(@".\private$\CreateNewEntity");

msgQ.Formatter = new XmlMessageFormatter(new []{typeof(MyType)});            
var msg = msgQ.Receive();

msgQ.Close();
return msg.Body as MyType;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...