淺談WebService返回數據效率對比


本文轉載:http://www.cnblogs.com/waynechan/archive/2012/06/25/2560685.html

一、什么是WebService:

       簡單通俗來說,就是企業之間、網站之間通過Internet來訪問並使用在線服務,一些數據,由於安全性問題,不能提供數據庫給其他單位使用,這時候可以使   用WebService服務提供。

二、創建WebService

創建WebService之后,我們就可以在文件里寫返回數據的方法了。


三、返回數據的四種形式

筆者水平有限,只列出這四種數據的返回形式:

  (1)直接返回DataSet對象
   (2)返回DataSet對象用Binary序列化后的字節數組
   (3)返回DataSetSurrogate對象用Binary序列化后的 字節數組
   (4)返回DataSetSurrogate對象用Binary序列化並Zip 壓縮后的字節數組


理論上來說,網絡傳輸字節與傳輸時間,應該是遞減的,其中,(3)(4)種方法需要引用微軟提供的開源組件  下載地址:http://support.microsoft.com/kb/829740/zh-cn


下面展示這四種返回數據的代碼,其中(1)是其三種方法的根本,都要得到一個DataSet作為根本,然后來做各種轉換壓縮的操作:

 

[WebMethod(Description =  " 直接返回DataSet對象 ")]  
      public DataSet GetDataSet()  
     {  
          string connStr = System.Configuration.ConfigurationManager.ConnectionStrings[ " conn "].ToString();  
         SqlConnection conn =  new SqlConnection(connStr);  
          string sql =  " select * from china_city ";  
         conn.Open();  
         SqlDataAdapter sda =  new SqlDataAdapter(sql, conn);  
         DataSet ds =  new DataSet( " China ");  
         sda.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[] bufferZip = ComPress(buffer);  
          return buffer;  
     }  
      // 壓縮方法  
      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,  0int.Parse(ms.Length.ToString()));  
              return compressed_data;  
         }  
          catch  
         {  
              return  null;  
         }  
     }

 

我們可以在瀏覽器中查看下WebService的效果,如圖,在這個頁面中,有提供四個方法,這四個方法就是上述我們寫的四個返回數據的方法了,點擊方法即可返回相應的數據,這樣,我們數據提供方的代碼就可以寫好了,接下來,我們寫調用數據的方法!



四、調用數據

客戶端WebService程序

 

 

復制代碼
private void button1_Click( object sender, EventArgs e) 
    { 
        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();  // new出WebService對象 
        DateTime dtBegin = DateTime.Now; 
        DataSet dataSet = ds.GetNorthwindDataSet(); 
        this.label1.Text = string.Format( " 耗時:{0} ", DateTime.Now - dtBegin); 
        binddata(dataSet); 
    } 
    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); 
    } 
    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); 
    } 
    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 + " 條記錄 "
    }
復制代碼

在數據返回的方法中,我們使用了數據的壓縮,所以,在調用方這邊,需要進行解壓,代碼:

 

復制代碼
客戶端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
            } 
        } 
    }
復制代碼

在上例中,調用四個方法的效果是一樣的,唯一不同的是,傳輸過程中,數據量大小和傳輸時間的差異。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM