一、什麼是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()
DataSetSurrogate dss = new DataSetSurrogate(ds);
ser.Serialize(ms, dss);
[WebMethod(Description = "直接傳回DataSetSurrogate對象,并用Binary序列化後并且ZIP壓縮的位元組數組")]
public byte[] GetDataSetSurrogateZipBytes()
byte[] bufferZip = ComPress(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, 0, int.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();
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;
private void button3_Click(object sender, EventArgs e)
byte[] buffer = ds.GetDataSetSurrogateBytes();
DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
DataSet dataSet = dss.ConvertToDataSet();
this.label3.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin) + " " + buffer.Length;
private void button4_Click(object sender, EventArgs e)
byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();
byte[] buffer = UnZipClass.Decompress(zipBuffer);
this.label4.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin) + " " + zipBuffer.Length;
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;
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;
在上例中,調用四個方法的效果是一樣的,唯一不同的是,傳輸過程中,資料量大小和傳輸時間的差異。