• MSMQ +C#,接收与编码的字节的消息[]身体的行为有所不同的Windows 7与Windows XP中

  • 本文关于 c#,.net,windows-7,msmq
  • CodeGo.net > MSMQ +C#,接收与编码的字节的消息[]身体的行为有所不同的Windows 7与Windows XP中
  •  

    MSMQ +C#,接收与编码的字节的消息[]身体的行为有所不同的Windows 7与Windows XP中



    c# .net windows-7 msmq
    我有一个显示在队列中的内容的应用程序。有Windows 7上不保留在身体的数据的真实对象类型与MSMQ一个问题。在这个例子中,我发送一个字节[],再后来当我收到它,它不再是一个字节数组,但包裹的XML容器在Windows XP中我从未有过这个问题,而Message.Body物业始终正确被设置为一个字节[]。 下面是代码:
     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);
      }
     }
    
    这里是一个它结束了作为一个包装了编码的二进制数据的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;
       }
    
    我想指出的是,我设置了格式 CodeGo.net,其中是优先步,以获得身体自动“盒子”,并在队列中“拆箱”。 在Windows XP中,m.Body.GetType()==byte []的,喜欢的预期。但是,在Windows 7中,m.Body.GetType()==即包装的XML。它不再是“unboxes” 我们需要做的不同?我们已经围绕它来发送字符串,你可以在接收函数的末尾曾看到过一次,但我想找到为什么这段代码的行为不同在Windows 7上一个真正的答案。
    本文地址 :CodeGo.net/1183959/
    -------------------------------------------------------------------------------------------------------------------------
    1.如果您要发送的字节数组使用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);
    

    2. 使用Message.BodyStream财产用于发送和看看你下面的代码可以发送和接收byte[]使用它。
    public void SendMessage()
    {
     MessageQueue myQueue = new MessageQueue(".\\QUEUE");
     byte[] msg = new byte[2];
     msg[0] = 29;    
     // Send the array to the queue.
     Message msg1 = new Message();
     msg1.BodyStream = new MemoryStream(msg);
     messageQueue.Send(msg1);    
    }
    public void ReceiveMessage()
    {
     MessageQueue myQueue = new MessageQueue(".\\QUEUE");    
     Message myMessage =myQueue.Receive();
     byte[] msg = ReadFully(myMessage.BodyStream);
    }
    public static byte[] ReadFully(Stream input)
    {
     byte[] buffer = new byte[16 * 1024];
     using (MemoryStream ms = new MemoryStream())
     {
      int read;
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
      {
       ms.Write(buffer, 0, read);
      }
      return ms.ToArray();
     }
    }
    

    本文标题 :MSMQ +C#,接收与编码的字节的消息[]身体的行为有所不同的Windows 7与Windows XP中
    本文地址 :CodeGo.net/1183959/
    1. 2003系统,我的3个系统帐户怎么在注册表里面找到呢?我在HKL_machine\sam\sam下没看到.
    2. 在字典<string,Attachment>,是附件引用或值?
    3. 关于timer。 要实现这样的一个函数:在form中,添加
    4. 列表<Int32>加入与在LINQ-SQL中推荐索取表
    5. ClickOnce 发布问题
    6. 无法访问的表单提交在ASP.NET表单变量
    7. 用GricView是否有防SQL注入的措施
    8. 你可以找到错误在我的SQL语法?
    9. 能否在PictureBox里面显示Form实例?
    10. 如何使用存储整数值(一个SQL查询的结果)的字符串?

     
    

    Copyright © 2017 CodeGo.net
    http://codego.net/xinwen/ 足球比分网 足球比分 医药招商网 邵阳县新闻