winform客戶端利用webClient實現與Web服務端的數據傳輸


由於項目需要,最近研究了下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數據
 }
}

以上均為自己的拙見,若有不對,敬請批評指正。歡迎交流。(后期應該會繼續更新)


免責聲明!

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



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