1. 程式人生 > >webservice 返回資料的四種方法

webservice 返回資料的四種方法

  在使用WebService進行遠端資料操作時,細心的你會發現WebServices的效能特別的慢,當然也曾聽見很多網友也如此如何如何。說實話,WebServices的確比呼叫本地資料要慢一些,可究竟有多慢?真的如網友們說的那麼難以忍受嗎?我個人感覺,多半原因在處理的方式上。讓我們親自編寫測試程式碼,來證明這一切吧。文章由我參考一網友的寫法來測試的,因此難免會參雜個人主觀因素,如你有新的想法或建議,還請多多提出。以下我們主要從呼叫WebServices的方法的特點、應用場景、測試結果三個方面來進行下說明分析。

 

轉載自:https://blog.csdn.net/chenxiaoqiang/article/details/50260977/

1、直接返回DataSet物件
特點:直接返回DataSet物件。
應用場景:a、內網;b、外網且資料量在kb級別時;c、遠端sql2000資料庫
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
    應用場景:外網環境需要進行大資料量網路資料傳遞時,建議採用此種方法。也是筆者強烈向大家推薦使用的一種方法。

WebService原始碼如下:

 

 
  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Web;

  5. using System.Web.Services;

  6. using System.Data;

  7. using System.Runtime.Serialization.Formatters.Binary;

  8. using System.IO;

  9. using System.IO.Compression;

  10. using System.Text;

  11. using DAL;

  12.  
  13. /// <summary>

  14. ///WebServiceTest 的摘要說明

  15. /// </summary>

  16. [WebService(Namespace = "http://tempuri.org/")]

  17. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

  18. //若要允許使用 ASP.NET AJAX 從指令碼中呼叫此 Web 服務,請取消對下行的註釋。

  19. // [System.Web.Script.Services.ScriptService]

  20. public class WebServiceTest : System.Web.Services.WebService {

  21.  
  22. public WebServiceTest () {

  23.  
  24. //如果使用設計的元件,請取消註釋以下行

  25. //InitializeComponent();

  26. }

  27.  
  28. [WebMethod]

  29. public string HelloWorld() {

  30. return "Hello World";

  31. }

  32. [WebMethod(Description="直接返回DataSet物件")]

  33. public DataSet GetDataSet()

  34. {

  35. StringBuilder builder = new StringBuilder();

  36. builder.Append("select * from ServiceInfo");

  37. DataSet ds = SQLHelper.Query(builder.ToString());

  38. return ds;

  39. }

  40. [WebMethod(Description = "返回DataSet物件用Binary序列化後的位元組陣列")]

  41. public byte[] GetBytes()

  42. {

  43. DataSet ds = GetDataSet();

  44. BinaryFormatter bf = new BinaryFormatter();

  45. MemoryStream ms = new MemoryStream();

  46. bf.Serialize(ms, ds);

  47. byte[] buffer = ms.ToArray();

  48. return buffer;

  49. }

  50. [WebMethod(Description = "返回DataSetSurrogate物件用Binary序列化後的位元組陣列")]

  51. public byte[] GetDataSetSurrogateBytes()

  52. {

  53. DataSet ds = GetDataSet();

  54. DataSetSurrogate dss = new DataSetSurrogate(ds);

  55. BinaryFormatter bf = new BinaryFormatter();

  56. MemoryStream ms = new MemoryStream();

  57. bf.Serialize(ms, dss);

  58. byte[] buffer = ms.ToArray();

  59. return buffer;

  60. }

  61. [WebMethod(Description = "返回DataSetSurrogate物件用Binary序列化並ZIP壓縮後的位元組陣列")]

  62. public byte[] GetDataSetSurrogateZipBytes()

  63. {

  64. DataSet DS = GetDataSet();

  65. DataSetSurrogate dss = new DataSetSurrogate(DS);

  66. BinaryFormatter bf = new BinaryFormatter();

  67. MemoryStream ms = new MemoryStream();

  68. bf.Serialize(ms, dss);

  69. byte[] buffer = ms.ToArray();

  70. byte[] Zipbuffer = Compress(buffer);

  71. return Zipbuffer;

  72. }

  73. //壓縮壓縮後的位元組陣列

  74. public byte[] Compress(byte[] data)

  75. {

  76. MemoryStream ms = new MemoryStream();

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

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

  79. zipStream.Close();

  80. ms.Position = 0;

  81. byte[] buffer = new byte[ms.Length];

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

  83. return buffer;

  84. }

  85. }


客戶端呼叫WebService前臺原始碼如下:

 

 

 
  1. <%@ Page Language="C#" CodeFile="WebTest.aspx.cs" Inherits="WebTest" %>

  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">

  6. <head runat="server">

  7. <title></title>

  8. </head>

  9. <body>

  10. <form id="form1" runat="server">

  11. <div>

  12. <asp:Button ID="Button1" runat="server" onclick="Button1_Click"

  13. Text="直接得到DataSet物件" />

  14. <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

  15. <br />

  16. <asp:Button ID="Button2" runat="server" onclick="Button2_Click"

  17. Text="得到DataSet物件用Binary序列化後的位元組陣列" />

  18. <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>

  19. <br />

  20. <asp:Button ID="Button3" runat="server" onclick="Button3_Click"

  21. style="height: 26px" Text="得到DataSetSurrogate物件用Binary序列化後的位元組陣列" />

  22. <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>

  23. <br />

  24. <asp:Button ID="Button4" runat="server" onclick="Button4_Click"

  25. Text="得到DataSetSurrogate物件用Binary序列化並ZIP壓縮後的位元組陣列" />

  26. <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>

  27. <br />

  28. <asp:GridView ID="GridView1" runat="server" Width="100%">

  29. </asp:GridView>

  30. </div>

  31. </form>

  32. </body>

  33. </html>

 

客戶端呼叫WebService後臺原始碼如下:

 

 

 
  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Web;

  5. using System.Web.UI;

  6. using System.Web.UI.WebControls;

  7. using System.Data;

  8. using System.Diagnostics;

  9. using System.Runtime.Serialization.Formatters.Binary;

  10. using WebServicesClient;

  11. using System.IO;

  12.  
  13.  
  14. public partial class WebTest : System.Web.UI.Page

  15. {

  16. WebServiceTest s = new WebServiceTest();

  17. protected void Page_Load(object sender, EventArgs e)

  18. {

  19.  
  20. }

  21. protected void Button1_Click(object sender, EventArgs e)

  22. {

  23. Stopwatch sw = new Stopwatch();

  24. sw.Start();

  25. DataSet ds = s.GetDataSet();

  26. GridView1.DataSource = ds.Tables[0].DefaultView;

  27. GridView1.DataBind();

  28. sw.Stop();

  29. Label1.Text = string.Format("耗時:{0}毫秒", sw.ElapsedMilliseconds.ToString());

  30. }

  31. protected void Button2_Click(object sender, EventArgs e)

  32. {

  33. Stopwatch sw = new Stopwatch();

  34. sw.Start();

  35. byte[] buffer = s.GetBytes();

  36. BinaryFormatter bf = new BinaryFormatter();

  37. DataSet ds = bf.Deserialize(new MemoryStream(buffer)) as DataSet;

  38. GridView1.DataSource = ds.Tables[0].DefaultView;

  39. GridView1.DataBind();

  40. sw.Stop();

  41. Label2.Text = string.Format("耗時:{1}毫秒;資料大小:{0}", buffer.Length.ToString(), sw.ElapsedMilliseconds.ToString());

  42. }

  43. protected void Button3_Click(object sender, EventArgs e)

  44. {

  45. Stopwatch sw = new Stopwatch();

  46. sw.Start();

  47. byte[] buffer = s.GetDataSetSurrogateBytes();

  48. BinaryFormatter bf = new BinaryFormatter();

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

  50. DataSet ds = dss.ConvertToDataSet();

  51. GridView1.DataSource = ds.Tables[0].DefaultView;

  52. GridView1.DataBind();

  53. sw.Stop();

  54. Label3.Text = string.Format("耗時:{1}毫秒;資料大小:{0}", buffer.Length.ToString(), sw.ElapsedMilliseconds.ToString());

  55. }

  56. protected void Button4_Click(object sender, EventArgs e)

  57. {

  58. Stopwatch sw = new Stopwatch();

  59. sw.Start();

  60. byte[] zipBuffer = s.GetDataSetSurrogateZipBytes();

  61. byte[] buffer = UnZip.Decompress(zipBuffer);

  62. BinaryFormatter bf = new BinaryFormatter();

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

  64. DataSet ds = dss.ConvertToDataSet();

  65. GridView1.DataSource = ds.Tables[0].DefaultView;

  66. GridView1.DataBind();

  67. sw.Stop();

  68.  
  69. Label4.Text = string.Format("耗時:{1}毫秒;資料大小:{0}", zipBuffer.Length.ToString(), sw.ElapsedMilliseconds.ToString());

  70. }

  71. }


測試的結果按照先後順序如下圖所示:
通過WebService返回資料的四種方法比較
    關於測試結果的說明,由於測試環境是資料庫在區域網的另一臺機器上,資料量也不是很大,測試的結果離實際情況還不是很接近,如果大家有條件的話,可以測試一下,同時希望把測試的結果提供給大家參考。
    但是在測試過程中你會發現,第一次點選每個按鈕測試和第二次點選按鈕或者更多次點選按鈕測試的結果是有所變化的,相關細節還需要你自己在測試中體會。
    關於原始碼的說明:開發環境為VS2010中文版,資料庫為區域網內SQL2000資料庫。