日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常用WebServices返回数据的4种方法比较

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用WebServices返回数据的4种方法比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以前經常在群里聽到朋友們說WebServices的性能特別的慢,說的如何如何。說實話,WebServices的確比調用本地數據要慢一些,可是究竟有多慢,真的如朋友們說的那么難以忍受嗎?我個人感覺,多半原因在處理的方式上。讓我們親自編寫測試代碼,來證明這一切吧。文章由于是我一段時間的總結篇,因此難免參雜個人主觀因素,說的不對的地方,還請多多批評。以下我們主要從調用WebServices的方法的特點、應用場景、測試結果三個方面來進行下說明分析。

1. 直接返回DataSet對象

??? 特點:直接返回DataSet對象。

??? 應用場景:1.內網。2.外網且數據量在kb級別時。

2.返回DataSet對象用Binary序列化后的字節數組

? ? 特點:字節數組流的處理模式。

? ? 應用場景:較大數據交換。

3.返回DataSetSurrogate對象用Binary 序列化后的字節數組

? ? 特點:使用微軟提供的開源組件進行序列化,依然是字節流的處理模式。詳情請參考:http://support.microsoft.com/kb/829740/zh-cn

? ? 應用場景: 較大數據交換。

4.返回DataSetSurrogate對象用Binary 序列化并Zip壓縮后的字節數組

? ?? 特點:使用微軟提供的開源組件對字節流數組進行壓縮后傳遞,依然是字節流的處理模式。詳情請參考:http://support.microsoft.com/kb/829740/zh-cn

? ?? 應用場景:外網環境需要進行大數據量網絡數據傳遞時,建議采用此種方法。也是筆者強烈向大家推薦使用的一種方法。

WebServices的代碼如下:

WebServices
using?System;
using?System.Collections.Generic;
using?System.Web;
using?System.Web.Services;


using?System.Data;
using?Microsoft.Practices.EnterpriseLibrary.Common;
using?Microsoft.Practices.EnterpriseLibrary.Data;
using?System.IO;
using?System.IO.Compression;
using?System.Runtime.Serialization.Formatters.Binary;
namespace?WebService1
{
????
///?<summary>
????
///?Service1?的摘要說明
????
///?</summary>
????[WebService(Namespace?=?"http://tempuri.org/")]
????[WebServiceBinding(ConformsTo?
=?WsiProfiles.BasicProfile1_1)]
????[System.ComponentModel.ToolboxItem(
false)]
????
public?class?Service1?:?System.Web.Services.WebService
????{
????????[WebMethod(Description
="直接返回DataSet對象")]
????????
public?DataSet?GetDataSet()
????????{
????????????
string?sql?=?"select?*?from?Customers";
????????????Database?db?
=?DatabaseFactory.CreateDatabase();
????????????DataSet?ds?
=?db.ExecuteDataSet(CommandType.Text,sql);
????????????
return?ds;
????????}

????????[WebMethod(Description?
=?"返回DataSet對象用Binary序列化后的字節數組")]
????????
public?byte[]?GetBytes()
????????{
????????????DataSet?ds?
=?GetDataSet();
????????????BinaryFormatter?bf?
=?new?BinaryFormatter();
????????????MemoryStream?ms?
=?new?MemoryStream();
????????????bf.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?bf?
=?new?BinaryFormatter();
????????????MemoryStream?ms?
=?new?MemoryStream();
????????????bf.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?bf?
=?new?BinaryFormatter();
????????????MemoryStream?ms?
=?new?MemoryStream();
????????????bf.Serialize(ms,?dss);
????????????
byte[]?buffer?=?ms.ToArray();
????????????
byte[]?Zipbuffer?=?Compress(buffer);
????????????
return?Zipbuffer;
????????}

????????
//壓縮壓縮后的字節數組
????????public?byte[]?Compress(byte[]?data)
????????{
????????????MemoryStream?ms?
=?new?MemoryStream();
????????????Stream?zipStream?
=?new?GZipStream(ms,?CompressionMode.Compress,?true);
????????????zipStream.Write(data,?
0,?data.Length);
????????????zipStream.Close();
????????????ms.Position?
=?0;
????????????
byte[]?buffer?=?new?byte[ms.Length];
????????????ms.Read(buffer,?
0,int.Parse(ms.Length.ToString()));
????????????
return?buffer;
????????}
????}
}

?

客戶端調用WebServices的代碼如下:

客戶端調用WebServices
using?System;
using?System.Collections.Generic;
using?System.Web;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?WebServicesClient.localhost;
using?System.Data;
using?System.Runtime.Serialization.Formatters.Binary;
using?System.IO;
using?System.Diagnostics;
namespace?WebServicesClient
{
????
public?partial?class?_Default?:?System.Web.UI.Page
????{
????????Service1?s?
=?new?Service1();
????????
protected?void?Page_Load(object?sender,?EventArgs?e)
????????{

????????}

????????
//直接返回DataSet對象
????????protected?void?Button1_Click(object?sender,?EventArgs?e)
????????{
????????????Stopwatch?sw?
=?new?Stopwatch();
????????????sw.Start();
????????????DataSet?ds?
=?s.GetDataSet();
????????????GridView1.DataSource?
=?ds.Tables[0].DefaultView;
????????????GridView1.DataBind();
????????????sw.Stop();
????????????Label1.Text?
=?string.Format("耗時:{0}毫秒",?sw.ElapsedMilliseconds.ToString());
????????}

????????
//得到DataSet對象用Binary序列化后的字節數組
????????protected?void?Button2_Click(object?sender,?EventArgs?e)
????????{
????????????Stopwatch?sw?
=?new?Stopwatch();
????????????sw.Start();
????????????
byte[]?buffer?=?s.GetBytes();
????????????BinaryFormatter?bf?
=?new?BinaryFormatter();
????????????DataSet?ds?
=?bf.Deserialize(new?MemoryStream(buffer))?as?DataSet;
????????????GridView1.DataSource?
=?ds.Tables[0].DefaultView;
????????????GridView1.DataBind();
????????????sw.Stop();
????????????Label2.Text?
=?string.Format("耗時:{1}毫秒;數據大小:{0}",?buffer.Length.ToString(),?sw.ElapsedMilliseconds.ToString());
????????}
????????
//得到DataSetSurrogate對象用Binary序列化后的字節數組
????????protected?void?Button3_Click(object?sender,?EventArgs?e)
????????{
????????????Stopwatch?sw?
=?new?Stopwatch();
????????????sw.Start();
????????????
byte[]?buffer?=?s.GetDataSetSurrogateBytes();
????????????BinaryFormatter?bf?
=?new?BinaryFormatter();
????????????DataSetSurrogate?dss?
=?bf.Deserialize(new?MemoryStream(buffer))?as?DataSetSurrogate;
????????????DataSet?ds?
=?dss.ConvertToDataSet();
????????????GridView1.DataSource?
=?ds.Tables[0].DefaultView;
????????????GridView1.DataBind();
????????????sw.Stop();
????????????Label3.Text?
=?string.Format("耗時:{1}毫秒;數據大小:{0}",?buffer.Length.ToString(),?sw.ElapsedMilliseconds.ToString());
????????}
????????
//得到DataSetSurrogate對象用Binary序列化并ZIP壓縮后的字節數組
????????protected?void?Button4_Click(object?sender,?EventArgs?e)
????????{
????????????Stopwatch?sw?
=?new?Stopwatch();
????????????sw.Start();
????????????
byte[]?zipBuffer?=?s.GetDataSetSurrogateZipBytes();
????????????
byte[]?buffer?=?UnZip.Decompress(zipBuffer);
????????????BinaryFormatter?bf?
=?new?BinaryFormatter();
????????????DataSetSurrogate?dss?
=?bf.Deserialize(new?MemoryStream(buffer))?as?DataSetSurrogate;
????????????DataSet?ds?
=?dss.ConvertToDataSet();
????????????GridView1.DataSource?
=?ds.Tables[0].DefaultView;
????????????GridView1.DataBind();
????????????sw.Stop();

????????????Label4.Text?
=?string.Format("耗時:{1}毫秒;數據大小:{0}",zipBuffer.Length.ToString(),sw.ElapsedMilliseconds.ToString());
????????}
????}
}

?

測試的結果按照先后順序如下圖所示:


關于測試結果的特殊說明:由于測試環境是在本地,數據量也不是很大,測試的結果離實際情況還不是很接近,如果大家有條件的話,可以測試一下,同時希望把測試的結果提供給大家參考。

最后,為了方便大家,這里還提供了源碼下載,下載地址如下:

/Files/wlb/WebServiceSummary.rar?

關于源代碼的特殊說明:筆者這里的開發環境為VS2008中文版sp1+SQLServer2008sp1。數據庫為Northwind數據庫。

轉載于:https://www.cnblogs.com/aaa6818162/archive/2009/08/07/1541058.html

總結

以上是生活随笔為你收集整理的常用WebServices返回数据的4种方法比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。