淺談WebService開發(一)


一、什么是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作為根本,然后來做各種轉換壓縮的操作:

 1 [WebMethod(Description =  " 直接返回DataSet對象 ")]  
 2      public DataSet GetDataSet()  
 3     {  
 4          string connStr = System.Configuration.ConfigurationManager.ConnectionStrings[ " conn "].ToString();  
 5         SqlConnection conn =  new SqlConnection(connStr);  
 6          string sql =  " select * from china_city ";  
 7         conn.Open();  
 8         SqlDataAdapter sda =  new SqlDataAdapter(sql, conn);  
 9         DataSet ds =  new DataSet( " China ");  
10         sda.Fill(ds);  
11         conn.Close();  
12          return ds;  
13     }  
14   
15     [WebMethod(Description =  " 直接返回DataSet對象,並用Binary序列化后的字節數組 ")]  
16      public  byte[] GetDataSetBytes()  
17     {  
18         DataSet ds = GetDataSet();  
19         BinaryFormatter ser =  new BinaryFormatter();   // 序列化對象  
20         MemoryStream ms =  new MemoryStream();   // 內存流  
21         ser.Serialize(ms, ds);  
22          byte[] buffer = ms.ToArray();     // 字節流  
23          return buffer;  
24     }  
25   
26     [WebMethod(Description =  " 直接返回DataSetSurrogate對象,並用Binary序列化后的字節數組 ")]  
27      public  byte[] GetDataSetSurrogateBytes()  
28     {  
29         DataSet ds = GetDataSet();  
30         DataSetSurrogate dss =  new DataSetSurrogate(ds);  
31         BinaryFormatter ser =  new BinaryFormatter();   // 序列化對象  
32         MemoryStream ms =  new MemoryStream();   // 內存流  
33         ser.Serialize(ms, dss);  
34          byte[] buffer = ms.ToArray();     // 字節流  
35          return buffer;  
36   
37     }  
38   
39     [WebMethod(Description =  " 直接返回DataSetSurrogate對象,並用Binary序列化后並且ZIP壓縮的字節數組 ")]  
40      public  byte[] GetDataSetSurrogateZipBytes()  
41     {  
42         DataSet ds = GetDataSet();  
43         DataSetSurrogate dss =  new DataSetSurrogate(ds);  
44         BinaryFormatter ser =  new BinaryFormatter();   // 序列化對象  
45         MemoryStream ms =  new MemoryStream();   // 內存流  
46         ser.Serialize(ms, dss);  
47          byte[] buffer = ms.ToArray();     // 字節流  
48          byte[] bufferZip = ComPress(buffer);  
49          return buffer;  
50     }  
51      // 壓縮方法  
52      public  byte[] ComPress( byte[] data)  
53     {  
54          try  
55         {  
56             MemoryStream ms =  new MemoryStream();  
57             Stream zipStream =  null;  
58             zipStream =  new GZipStream(ms, CompressionMode.Compress,  true);  
59             zipStream.Write(data,  0, data.Length);  
60             zipStream.Close();  
61             ms.Position =  0;  
62              byte[] compressed_data =  new  byte[ms.Length];  
63             ms.Read(compressed_data,  0int.Parse(ms.Length.ToString()));  
64              return compressed_data;  
65         }  
66          catch  
67         {  
68              return  null;  
69         }  
70     } 

 

我們可以在瀏覽器中查看下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;  
            }  
        }  
    } 

 

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

 

 聲明:此博客為DotNetGeek.cn的Copy ,原文鏈接 http://www.dotnetgeek.cn/xuexiwebservice1.html

 

 


免責聲明!

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



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