分享WebService大数据量处理的优化性能进行网络传输

    技术2022-05-19  24

    1)直接返回DataSet对象

     特点:通常组件化的处理机制,不加任何修饰及处理;

     优点:代码精减、易于处理,小数据量处理较快;

     缺点:大数据量的传递处理慢,消耗网络资源;

     建议:当应用系统在内网、专网(局域网)的应用时,或外网(广域网)且数据量在KB级时的应用时,采用此种模式。

     

    示例如下

    [WebMethod(Description = "直接返回 DataSet 对象。")]

         public DataSet GetNorthwindDataSet()

         {

             string sql = "SELECT * FROM XT_TEXT";

             SqlConnection conn = new SqlConnection("Server=60.28.25.58;DataBase=s168593;user id=s168593;password=h0y FeC*;");

             conn.Open();

             SqlDataAdapter dataadapter = new SqlDataAdapter(sql, conn);

             DataSet ds = new DataSet();

             dataadapter.Fill(ds, "XT_TEXT");

             conn.Close();

             return ds;

          }

     

     

    客户程序调用方法:

     Code [http://www.xueit.com]private void button1_Click(object sender, EventArgs e)

    {

     

        //com.dzbsoft.www是上面Web Service发布后的命名空间

        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();

        DateTime dtBegin = DateTime.Now;

        DataSet dataSet = ds.GetNorthwindDataSet();

        this.label1.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin);

        binddata(dataSet);

    }

    2 返回DataSet对象用Binary序列化后的字节数组

      特点:字节数组流的处理模式;

      优点:易于处理,可以中文内容起到加密作用;

      缺点:大数据量的传递处理慢,较消耗网络资源;

    [WebMethod(Description = "返回 DataSet 对象用 Binary 序列化后的字节数组。")]

        public byte[] GetDataSetBytes()

        {

            DataSet dataSet = GetNorthwindDataSet();

            BinaryFormatter ser = new BinaryFormatter();

            MemoryStream ms = new MemoryStream();

            ser.Serialize(ms, dataSet);

            byte[] buffer = ms.ToArray();

            return buffer;

    }

     

    客户程序调用方法:

     Code [http://www.xueit.com]private void button2_Click(object sender, EventArgs e)

    {

        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();

        DateTime dtBegin = DateTime.Now;

        byte[] buffer = ds.GetDataSetBytes();

        BinaryFormatter ser = new BinaryFormatter();

        DataSet dataSet = ser.Deserialize(new MemoryStream(buffer)) as DataSet;

        this.label2.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin)   "  "   buffer.Length;

        binddata(dataSet);

    }

     

    (3) 返回DataSetSurrogate对象用Binary序列化后的字节数组

      特点:微软提供的开源组件;

     下载地址:

                      http://support.microsoft.com/kb/829740/zh-cn

    优点:易于处理,可以中文内容起到加密作用;

    缺点:大数据量的传递处理慢,较消耗网络资源; 示例如下:

     

    [WebMethod(Description = "返回 DataSetSurrogate 对象用 Binary 序列化后的字节数组。")]

         public byte[] GetDataSetSurrogateBytes()

         {

             DataSet dataSet = GetNorthwindDataSet();

             DataSetSurrogate dss = new DataSetSurrogate(dataSet);

             BinaryFormatter ser = new BinaryFormatter();

             MemoryStream ms = new MemoryStream();

             ser.Serialize(ms, dss);

             byte[] buffer = ms.ToArray();

             return buffer;

    }

    客户程序调用方法:

     Code [http://www.xueit.com] 1 private void button3_Click(object sender, EventArgs e)

    {

         com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();

         DateTime dtBegin = DateTime.Now;

         byte[] buffer = ds.GetDataSetSurrogateBytes();

         BinaryFormatter ser = new BinaryFormatter();

         DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;

         DataSet dataSet = dss.ConvertToDataSet();

         this.label3.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin)   "  "   buffer.Length;

         binddata(dataSet);

    (4)返回DataSetSurrogate对象用Binary序列化并Zip压缩后的字节数组

     特点:对字节流数组进行压缩后传递;  优点:当数据量大时,性能提高效果明显,压缩比例大;  缺点:相比第三方组件,压缩比例还有待提高;  建议:当系统需要进行大数据量网络数据传递时,建议采用此种可靠、高效、免费的方法

    客户端UnZipClass程序

      public static class UnZipClass

    {

         public static byte[] Decompress(byte[] data)

         {

             try

             {

                 MemoryStream ms = new MemoryStream(data);

    Stream zipStream = null;

                 zipStream = new GZipStream(ms, CompressionMode.Decompress);

                 byte[] dc_data = null;

                 dc_data = ExtractBytesFromStream(zipStream, data.Length);

                 return dc_data;

             }

             catch

             {

                 return null;

             }

         }

         public static byte[] ExtractBytesFromStream(Stream zipStream, int dataBlock)

         {

             byte[] data = null;

             int totalBytesRead = 0;

             try

             {

                 while (true)

                 {

                     Array.Resize(ref data, totalBytesRead   dataBlock   1);

                     int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);

                     if (bytesRead == 0)

                     {

                         break;

                     }

                     totalBytesRead  = bytesRead;

                 }

                 Array.Resize(ref data, totalBytesRead);

                 return data;

             }

             catch

             {

                 return null;

             }

         }

    }

    以上为提高WebService性能大数据量网络传输处理的方法

    [WebMethod(Description = "返回 DataSetSurrogate 对象用 Binary 序列化并 Zip 压缩后的字节数组。")]

        public byte[] GetDataSetSurrogateZipBytes()

        {

            DataSet dataSet = GetNorthwindDataSet();

            DataSetSurrogate dss = new DataSetSurrogate(dataSet);

            BinaryFormatter ser = new BinaryFormatter();

            MemoryStream ms = new MemoryStream();

            ser.Serialize(ms, dss);

            byte[] buffer = ms.ToArray();

            byte[] zipBuffer = Compress(buffer);

            return zipBuffer;

       }

     

        public byte[] Compress(byte[] data)

        {

            try

            {

                MemoryStream ms = new MemoryStream();

                Stream zipStream = null;

                zipStream = new GZipStream(ms, CompressionMode.Compress, true);

                zipStream.Write(data, 0, data.Length);

                zipStream.Close();

                ms.Position = 0;

                byte[] compressed_data = new byte[ms.Length];

                ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));

                return compressed_data;

            }

            catch

            {

                return null;

            }

        }

    }

    客户程序调用方法

    private void button4_Click(object sender, EventArgs e)

    {

         com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();

         DateTime dtBegin = DateTime.Now;

         byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();

         byte[] buffer = UnZipClass.Decompress(zipBuffer);

         BinaryFormatter ser = new BinaryFormatter();

         DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;

          DataSet dataSet = dss.ConvertToDataSet();

         this.label4.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin)   "  "   zipBuffer.Length;

         binddata(dataSet);

    }

     

     

      private void binddata(DataSet dataSet)

      {

        this.dataGridView1.DataSource = dataSet.Tables[0];

        this.label5.Text = "共计:"   dataSet.Tables[0].Rows.Count   "条记录";

      }

     

     

    文章来自学IT网:http://www.xueit.com/asp.net/show-6902-3.aspx

     


    最新回复(0)