由於項目需要,最近研究了下WebClient的數據傳輸。關於WebClient介紹網上有很多詳細介紹,大概就是利用WebClient可以實現對Internet資源的訪問。無外乎客戶端發送請求,服務端處理請求、回應請求。所以,我下面就簡單描述下學習過程中遇到的一些問題:
1.關於Winform客戶端請求
WebClient wc = new WebClient();//初始化
webclient string path = "http://192.168.1.115:8089/Handler1.ashx";
Uri uri = new Uri(path + "?RequestType=uploaddata");
string str="Requestdata";
wc.UploadStringAsync(uri, str);
關於此處的UploadStringAsync方法,WebClient下有多個方法,UploadStringAsync是異步調用,服務器響應后會有一個回調函數,可以在回調函數里查看服務端返回來的信息。如下
void client_UploadStringCompleted(object o, UploadStringCompletedEventArgs e)
{
if (e.Error == null)
{
if (e.Result == "ok")
this.DialogResult = DialogResult.OK;
else
MessageBox.Show("相應處理", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
但是client_UploadStringCompleted事件提前注冊。
2.關於Web服務端處理請求
客戶端發出了請求,如果請求的Url沒有問題的話,服務端就會收到請求,這里注意到,之前請求的Url中有一個Handler1.ashx(一般處理程序),用來處理客戶端發出的請求。這樣Web服務端就可以直接在事件處理文件中處理請求信息,不需有前台頁面。
public void ProcessRequest(HttpContext context)
{
if (context.Request["RequestType"] == "uploaddata")
{
context.Response.ContentType = "text/plain";
context.Response.Write("ok");
}
}
在if中可以對請求進行處理,然后向客戶端發出響應的回應。
3.關於報錯之“遠程服務器返回錯誤(500):內部服務器錯誤”
之前在做簡單客戶端與服務端交互string類型的數據時並沒有遇到這個問題,但是后來研究服務器如何向客戶端返回datatable或者dataset數據時(一般在程序中都是要用到,程序基本不可能只有string數據交互),發現總是報這個錯,查了一上午的資料,也沒有解決自己的問題,網上的解決辦法有很多種,例如:遠程服務器是否更改了文件,遠程服務器沒有權限諸如此類,總之是服務端的問題,但是服務端的什么問題,由於沒有辦法測試服務端(因為Web服務端發布了的,這樣winform端才能訪問),所以一直不知道怎么解決。下午上班時,突然想到是不是自己的代碼有問題。就在另一個程序上測試了自己的代碼,發現語法上沒問題,但是邏輯上有問題。這才終於解決了困擾自己的問題。之后再遇到這樣的問題,首先就會去想是否代碼問題,若不是,再翻閱相關資料進行查詢。
4.關於服務端返回dataset數據
我所做的項目大概是這樣的,客戶端基本只負責數據顯示與數據填寫,然后將數據發送給服務端,服務端則負責與數據庫的交互,我們都知道,涉及到數據庫的交互,就難免會用到datatable,那我們應該怎么樣把datatable發給客戶端呢?網上查閱資料后,發現,可以將數據轉化為byte數組,通過序列化與反序列化實現,大致代碼如下
客戶端請求
wc.UploadDataAsync(uri, new byte[] { });//uri見之前的代碼
服務器響應並返回數據
DataTable table = sql.GetAircraftInfo();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
DataSet ds = new DataSet();
ds.Tables.Add(table);
bf.Serialize(ms, ds);
byte[] bytes = ms.ToArray();
ms.Close();
context.Response.ContentType = "text/plain";
context.Response.BinaryWrite(bytes);
客戶端反序列化數據
void client_UploadDataCompleted(object o, UploadDataCompletedEventArgs e)
{
if (e.Error == null)
{
byte[] bytes = e.Result;
MemoryStream ms = new MemoryStream(bytes);
BinaryFormatter bf = new BinaryFormatter();
ms.Position = 0;
DataSet ds = bf.Deserialize(ms) as DataSet;
DataTable table = ds.Tables[0];//得到table數據
}
}
以上均為自己的拙見,若有不對,敬請批評指正。歡迎交流。(后期應該會繼續更新)