mdi*_*bio 2 .net c# msmq windows-7
我有一个应用程序,显示MSMQ消息队列中的消息的内容.Windows 7上的MSMQ存在问题,而不是保留邮件正文中数据的真实对象类型.在这个例子中,我发送一个byte [],然后当我收到它时,它不再是一个字节数组,而是包装的XML容器文档.在Windows XP中,我从未遇到过此问题,并且Message.Body属性始终正确设置为byte [].
这是压缩代码:
public void SendWithCompression(string Message)
{
try
{
// Compress the message data in memory.
byte[] UncompressedData = Encoding.UTF8.GetBytes(Message);
byte[] CompressedData = null;
MemoryStream s = new MemoryStream();
using (GZipStream z = new GZipStream(s, CompressionMode.Compress))
{
z.Write(UncompressedData, 0, UncompressedData.Length);
}
CompressedData = s.ToArray();
if (_Transaction != null)
{
_Transaction.Begin();
base.Send(CompressedData, _Transaction);
_Transaction.Commit();
}
else
{
base.Send(CompressedData);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是测试消息的消息内容.它最终成为包装编码二进制数据的XML文档:
<?xml version="1.0"?>..<base64Binary>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ih63edMefTsvy2rv8V3+4/8ByygBlxMAAAA=</base64Binary>
以下是它使用的解压缩代码:
String Data;
//Get message and format XML
System.Messaging.Message m = MessagesList[ListIndex].Tag;
m.Formatter = new XmlMessageFormatter(new Type[]
{
typeof(string), // Send raw plain strings
typeof(byte[]), // Array of binary data
typeof(XmlNode) // Xml document
});
m.BodyStream.Position = 0;
Data = m.Body.ToString();
if (m.Body.GetType() == typeof(byte[]))
{
try
{
// The message body is an array of binary data.
// Assume it is a GZIP stream of compressed data.
byte[] CompressedData = (byte[])m.Body;
byte[] UncompressedData = null;
// Decompress it.
MemoryStream s = new MemoryStream(CompressedData);
using (GZipStream z = new GZipStream(s, CompressionMode.Decompress))
{
UncompressedData = MyExtensions.ReadRemainingBytes(z);
}
// Turn the bytes back into a string.
Data = Encoding.UTF8.GetString(UncompressedData);
}
catch
{
Data = "Unknown binary data: " +
BitConverter.ToString((byte[])m.Body, 0);
}
}
if (m.Body.GetType() == typeof(XmlElement))
{
XmlElement el = (XmlElement)m.Body;
if (el.Name == "string")
Data = el.InnerText;
else
Data = el.OuterXml;
}
Run Code Online (Sandbox Code Playgroud)
我想指出的是,我正在设置消息的格式化程序,这是让正文在队列中自动"装箱"和"取消装箱"的第一步.
在Windows XP中,m.Body.GetType()== byte [],与预期的一样.但是,在Windows 7中,m.Body.GetType()== XmlElement,即包装器XML.它不再"取消装箱"消息.
我们需要做一些不同的事情吗?我们已经解决了一次发送字符串的问题,正如您在接收函数结束时所看到的那样,但我想找到一个真正的答案,解释为什么此代码在Windows 7上的行为不同.
小智 7
如果要发送字节数组,请使用Message.BodyStream属性:
System.Messaging.MessageQueue queue = new MessageQueue(queueFormatName, false, true, QueueAccessMode.Send);
System.Messaging.Message msg = new System.Messaging.Message();
msg.BodyStream = new MemoryStream(buffer);
queue.Send(msg, MessageQueueTransactionType.Single);
Run Code Online (Sandbox Code Playgroud)