Я нашел эти два метода во время поиска ответа на этот вопрос, и они на самом деле работали отлично.
public System.Xml.XmlDocument ConvertToXMLDoc(System.Messaging.Message msg)
{
byte[] buffer = new byte[msg.BodyStream.Length];
msg.BodyStream.Read(buffer, 0, (int)msg.BodyStream.Length);
int envelopeStart = FindEnvolopeStart(buffer);
System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer, envelopeStart, buffer.Length - envelopeStart);
System.ServiceModel.Channels.BinaryMessageEncodingBindingElement elm = new System.ServiceModel.Channels.BinaryMessageEncodingBindingElement();
System.ServiceModel.Channels.Message msg1 = elm.CreateMessageEncoderFactory().Encoder.ReadMessage(stream, Int32.MaxValue);
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(msg1.GetReaderAtBodyContents());
msg.BodyStream.Position = 0;
return doc;
}
private int FindEnvolopeStart(byte[] stream)
{
int i = 0;
byte prevByte = stream[i];
byte curByte = (byte)0;
for (i = 0; i < stream.Length; i++)
{
curByte = stream[i];
if (curByte == (byte)0x02 &&
prevByte == (byte)0x56)
break;
prevByte = curByte;
}
return i - 1;
}
Просто вызовите функцию ConvertToXmlDoc, предоставив сообщение из очереди сообщений, и вы получите XmlDocument обратно. Я ленивый, поэтому я просто помещаю innerXml в файл, чтобы я мог его прочитать.
MessageQueue queue = new MessageQueue(queueName);
var msg = queue.Receive();
var doc = ConvertToXMLDoc(msg);
using (var sw = new StreamWriter(@"C:\message.txt")))
sw.Write(doc.InnerXml);
Нет приложения для покупки, и вы вернете свои данные в код, так что вы можете возиться с ним.
PS: Кредит, если кредит подлежит оплате. Фрагмент взят из http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c03d80cd-492c-4ece-8890-6a35b12352e0, который также ссылается на более подробное обсуждение формата кодировки MSMQ.