分享WebService大数据量处理的优化性能进行网络传输
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,data.Length); ??????????? zipStream.Close(); ??????????? ms.Position = 0; ??????????? byte[] compressed_data = new byte[ms.Length]; ??????????? ms.Read(compressed_data,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |