WebService

一、什么是WebService:

       简单通俗来说,就是企业之间、网站之间通过Internet来访问并使用在线服务,一些数据,由于安全性问题,不能提供数据库给其他单位使用,这时候可以使   用WebService服务提供。

 

二、创建WebService

vs2012 webservice以WCF服务 来  创建

创建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作为根本,然后来做各种转换压缩的操作:

01 [WebMethod(Description = "直接返回DataSet对象")]  
02 public DataSet GetDataSet()  
03 {  
04      string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ToString();  
05      SqlConnection conn = new SqlConnection(connStr);  
06      string sql = "select * from china_city";  
07      conn.Open();  
08      SqlDataAdapter sda = new SqlDataAdapter(sql, conn);  
09      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, 0, int.Parse(ms.Length.ToString()));  
64          return compressed_data;  
65      }  
66      catch 
67      {  
68          return null;  
69      }  
70 }

 

我们可以在浏览器中查看下WebService的效果,如图,在这个页面中,有提供四个方法,这四个方法就是上述我们写的四个返回数据的方法了,点击方法即可返回相应的数据,这样,我们数据提供方的代码就可以写好了,接下来,我们写调用数据的方法!

 

四、调用数据

客户端WebService程序

01 private void button1_Click(object sender, EventArgs e)  
02 {  
03     com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();  //new出WebService对象  
04     DateTime dtBegin = DateTime.Now;  
05     DataSet dataSet = ds.GetNorthwindDataSet();  
06     this.label1.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin);  
07     binddata(dataSet);  
08 }  
09 private void button2_Click(object sender, EventArgs e)  
10 {  
11     com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();  
12     DateTime dtBegin = DateTime.Now;  
13     byte[] buffer = ds.GetDataSetBytes();  
14     BinaryFormatter ser = new BinaryFormatter();  
15     DataSet dataSet = ser.Deserialize(new MemoryStream(buffer)) as DataSet;  
16     this.label2.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin) + "  " + buffer.Length;  
17     binddata(dataSet);  
18 }  
19 private void button3_Click(object sender, EventArgs e)  
20 {  
21     com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();  
22     DateTime dtBegin = DateTime.Now;  
23     byte[] buffer = ds.GetDataSetSurrogateBytes();  
24     BinaryFormatter ser = new BinaryFormatter();  
25     DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;  
26     DataSet dataSet = dss.ConvertToDataSet();  
27     this.label3.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin) + "  " + buffer.Length;  
28     binddata(dataSet);  
29 }  
30 private void button4_Click(object sender, EventArgs e)  
31 {  
32     com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();  
33     DateTime dtBegin = DateTime.Now;  
34     byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();  
35     byte[] buffer = UnZipClass.Decompress(zipBuffer);  
36     BinaryFormatter ser = new BinaryFormatter();  
37     DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;  
38     DataSet dataSet = dss.ConvertToDataSet();  
39     this.label4.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin) + "  " + zipBuffer.Length;  
40     binddata(dataSet);  
41 }  
42 private void binddata(DataSet dataSet)  
43 {  
44     this.dataGridView1.DataSource = dataSet.Tables[0];  
45     this.label5.Text = "共计:" + dataSet.Tables[0].Rows.Count + "条记录";  
46 }

在数据返回的方法中,我们使用了数据的压缩,所以,在调用方这边,需要进行解压,代码:

01 客户端UnZipClass程序  
02 public static class UnZipClass  
03 {  
04     public static byte[] Decompress(byte[] data)  
05     {  
06         try 
07         {  
08             MemoryStream ms = new MemoryStream(data);  
09             Stream zipStream = null;  
10             zipStream = new GZipStream(ms, CompressionMode.Decompress);  
11             byte[] dc_data = null;  
12             dc_data = ExtractBytesFromStream(zipStream, data.Length);  
13             return dc_data;  
14         }  
15         catch 
16         {  
17             return null;  
18         }  
19     }  
20     public static byte[] ExtractBytesFromStream(Stream zipStream, int dataBlock)  
21     {  
22         byte[] data = null;  
23         int totalBytesRead = 0;  
24         try 
25         {  
26             while (true)  
27             {  
28                 Array.Resize(ref data, totalBytesRead + dataBlock + 1);  
29                 int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);  
30                 if (bytesRead == 0)  
31                 {  
32                     break;  
33                 }  
34                 totalBytesRead += bytesRead;  
35             }  
36             Array.Resize(ref data, totalBytesRead);  
37             return data;  
38         }  
39         catch 
40         {  
41             return null;  
42         }  
43     }  
44 }

在上例中,调用四个方法的效果是一样的,唯一不同的是,传输过程中,数据量大小和传输时间的差异

posted @ 2014-05-07 12:50  x_window  阅读(172)  评论(0)    收藏  举报