C# 之 提高WebService性能大数据量网络传输处理
1、直接返回DataSet對象
特點:通常組件化的處理機制,不加任何修飾及處理;
優點:代碼精減、易于處理,小數據量處理較快;
缺點:大數據量的傳遞處理慢,消耗網絡資源;
建議:當應用系統在內網、專網(局域網)的應用時,或外網(廣域網)且數據量在KB級時的應用時,采用此種模式。
2、返回DataSet對象用Binary序列化后的字節數組?
特點:字節數組流的處理模式;
優點:易于處理,可以中文內容起到加密作用;
缺點:大數據量的傳遞處理慢,較消耗網絡資源;
建議:當系統需要進行較大數據交換時采用。
3、返回DataSetSurrogate對象用Binary序列化后的字節數組?
特點:微軟提供的開源組件;
優點:易于處理,可以中文內容起到加密作用;
缺點:大數據量的傳遞處理慢,較消耗網絡資源;
建議:當系統需要傳輸中文數據或需要加密時采用此種方式
4、返回DataSetSurrogate對象用Binary序列化并Zip壓縮后的字節數組
特點:對字節流數組進行壓縮后傳遞;
優點:當數據量大時,性能提高效果明顯,壓縮比例大;
缺點:相比第三方組件,壓縮比例還有待提高;
建議:當系統需要進行大數據量網絡數據傳遞時,建議采用此種可靠、高效、免費的方法。?
測試用例:SqlServer2000數據庫,數據量大小40000行,字段數10個,結果如下:
?
| ? 使用方法 | ? 用時(秒) | ? 數據量(Byte) | ? 大小 百分比(%) |
| ? 直接返回DataSet | ? 12.625 | ? 19629414 | ? 100% |
| ? 返回二進制序列化后DataSet | ? 9.712 | ? 12049645 | ? 61.38% |
| ? 返回轉化DataSetSurrogate的DataSet 并且二進制序列化后 | ? 7.943 | ? 5138990 | ? 26.18% |
| ? 返回轉化DataSetSurrogate的DataSet 并且二進制序列化后使用zip壓縮 | ? 7.619 | ? 978033 | ? 4.98% |
?
using System; using System.Data; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; using System.ComponentModel;using System.IO; using System.IO.Compression; using System.Data.SqlClient; using System.Runtime.Serialization.Formatters.Binary;namespace DataSetWebService {/// <summary>/// Service1 的摘要說明/// </summary>[WebService(Namespace = "http://tempuri.org/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)][ToolboxItem(false)]public class DataSetService : System.Web.Services.WebService{[WebMethod(Description="直接返回DataSet對象")]public DataSet GetDataSet(){//http://www.dzbsoft.com XT_TEXTstring 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 dataAd = new SqlDataAdapter(sql, conn);DataSet DS = new DataSet("XT_TEXT");dataAd.Fill(DS);conn.Close();return DS;}[WebMethod(Description = "返回DataSet對象用Binary序列化后的字節數組")]public byte[] GetDataSetBytes(){DataSet DS = GetDataSet();BinaryFormatter ser = new BinaryFormatter();MemoryStream ms = new MemoryStream();ser.Serialize(ms, DS);byte[] buffer = ms.ToArray();return buffer;}[WebMethod(Description = "返回DataSetSurrogate對象用Binary序列化后的字節數組")]public byte[] GetDataSetSurrogateBytes(){DataSet DS = GetDataSet();DataSetSurrogate dss = new DataSetSurrogate(DS);BinaryFormatter ser = new BinaryFormatter();MemoryStream ms = new MemoryStream();ser.Serialize(ms, dss);byte[] buffer = ms.ToArray();return buffer;}[WebMethod(Description = "返回DataSetSurrogate對象用Binary序列化并ZIP壓縮后的字節數組")]public byte[] GetDataSetSurrogateZipBytes(){DataSet DS = GetDataSet();DataSetSurrogate dss = new DataSetSurrogate(DS);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){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;}} }客戶端調用:C/Susing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;using System.IO; using System.IO.Compression; using System.Data.SqlClient; using System.Runtime.Serialization.Formatters.Binary;namespace Test {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void BindDataSet(DataSet DS){this.dataGridView1.DataSource = DS.Tables[0];}private void button1_Click(object sender, EventArgs e){com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();DateTime dtBegin = DateTime.Now;DataSet DS = ds.GetDataSet();this.label1.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin);BindDataSet(DS);}private void button2_Click(object sender, EventArgs e){com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();DateTime dtBegin = DateTime.Now;byte[] buffer = ds.GetDataSetBytes();DataSet DS = ds.GetDataSet();BinaryFormatter ser = new BinaryFormatter();DataSet dataset = ser.Deserialize(new MemoryStream(buffer)) as DataSet;this.label2.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + buffer.Length.ToString());BindDataSet(DS);}private void button3_Click(object sender, EventArgs e){com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();DateTime dtBegin = DateTime.Now;byte[] buffer = ds.GetDataSetSurrogateBytes();BinaryFormatter ser = new BinaryFormatter();DataSet DS = ds.GetDataSet();DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;DataSet dataset = dss.ConvertToDataSet();this.label3.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + buffer.Length.ToString());BindDataSet(DS);}private void button4_Click(object sender, EventArgs e){com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();DateTime dtBegin = DateTime.Now;byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();byte[] buffer = UnZipClass.Decompress(zipBuffer);BinaryFormatter ser = new BinaryFormatter();DataSet DS = ds.GetDataSet();DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;DataSet dataset = dss.ConvertToDataSet();this.label4.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + zipBuffer.Length.ToString());BindDataSet(DS);}} }UnZipClass.csusing System; using System.Collections.Generic; using System.Text; using System.IO; using System.IO.Compression;namespace Test {public static class UnZipClass{/// <summary>/// Decompresses the specified data./// </summary>/// <param name="data">The data.</param>/// <returns></returns>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 = EtractBytesFormStream(zipStream, data.Length);return dc_data;}catch{return null;}}public static byte[] EtractBytesFormStream(Stream zipStream, int dataBlock){try{byte[] data = null;int totalBytesRead = 0;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;}}} }?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的C# 之 提高WebService性能大数据量网络传输处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今天的几点感悟_20160429
- 下一篇: 揪出占用磁盘空间的罪魁祸首-企业生产实战