Winform中使用WebClient聯網處理數據


這兩天,遇到了一個winform聯網獲取數據的問題,於是從網上搜了些資料學習了一下,完了之后,也不能忘記總結。下面我就簡單談一下WebClient類的常見用法。

 
首先,我先談一下我對WebClient類中這些方法的操作方式的看法。我想,很多人可能跟我一樣,覺得MSDN對這個類的很多解釋和案例都讓人看起來覺得蛋疼,因為,解釋的比較含糊(或者說比較官方),舉得例子吧,也太簡單了,並且,只有客戶端的代碼,沒有服務器端的代碼。這些東西都讓人覺得WebClient這種操作方式挺神秘的。其實,真的沒有什么神秘的。服務器端,就是一個網頁(這個就是讓人不知為何物的CRI資源),這個網頁就跟一般的網頁只有一點不一樣,就是,如果需要向客戶端返回數據的話,用Response.write()方法輸出,這樣子就能被客戶端獲取到了。至於為什么能被客戶端獲取到,那我就不曉得了,這個問題得去問微軟。客戶端的代碼,比較簡單無非就是字符串啊,流啊,等。兩種提交的方式有必要說一下,一種是同步,一種是異步。
這種方式,比較適合於桌面軟件聯網訪問數據庫。其實,是桌面軟件訪問某個你做好的頁面,把某些參數傳到那個頁面中,然后,你在那個網頁中,根據傳遞過來的參數,把某些跟數據庫有關的業務邏輯處理一下,然后再返回客戶端。
下面,我貼出來一些代碼,以便更好地理解WebClient。
 
功能一:
向服務器提交數據:
 
客戶端代碼:
    private void btn_sent_Click(object sender, EventArgs e)
        {
           string data = this.textBox1.Text.ToString();
 
            Uri endpoint = new Uri("http://localhost:3778/Default2.aspx");//這個你可以根據自己的本地端口修改
 
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;
            //這是一種異步執行的方法,當數據下載完之后,會觸發UploadStringCompleted 事件,
            //   所以,我們注冊這個事件
            client.UploadStringCompleted +=
            new UploadStringCompletedEventHandler(client_UploadStringCompleted);
            client.UploadStringAsync(endpoint, "POST", data);
      }
        /// <summary>
        /// 下載完數據之后,就會調用這個方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
     void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }
 
 
 
服務器端代碼:
 
 
    protected void Page_Load(object sender, EventArgs e)
        {
            //獲取從客戶端傳來的信息   
            int length = Request.ContentLength;
            byte[] bytes = Request.BinaryRead(length);
 
            string txtContent =System.Text.Encoding.UTF8.GetString(bytes);
            
            //服務器在這里可以完成業務邏輯。舉個例子,如果從客戶端傳過來一條SQL語句,
            //那么,在這里就可以執行這條Sql語句。
            
            //從服務器端返回信息   
            Response.ContentType = "text/plain";
            Response.Write(txtContent);
        }
 
 
 
 
功能二:根據某些參數,從服務器檢索數據,並接受該數據
 
客戶端代碼:
             string tranType = "TextStr";//第一個參數
             sting tranType="weather"; //第二個參數。這兩個參數可以根據具體的邏輯改寫
            Uri endpoint = new Uri(String.Format("http://localhost:3778/Default.aspx?infoType=    
            {0}&tranType={1}", infoType, tranType));
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;           
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
 
            client.DownloadStringAsync(endpoint);
 
 
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            string RetStr = "";
            if (e.Error == null)
            {
                //RetStr = "WebClient成功通訊";
                RetStr = e.Result;     
          }
            else
            {
                RetStr = e.Error.Message;
            }
            MessageBox.Show( RetStr);  //顯示操作結果信息
 
        }
 
 
服務器端代碼:
 
     protected void Page_Load(object sender, EventArgs e)
        {
            //讀取從客戶端傳遞過來的參數   
            string infoTypeStr = Request.QueryString["infoType"];
            string tranTypeStr = Request.QueryString["tranType"];
            //根據參數,做一些相應的業務邏輯
            string  retValueStr  ="處理邏輯后的返回結果";
            Response.ContentType = "text/plain";
            Response.Write(retValueStr);  
        } 
 
 
這兩個功能,請參考http://blog.csdn.net/longlong821/article/details/7187524 。
 
功能三:想服務器上傳文件
這個思想就是把文件轉換成流的形式,然后發送到服務器端。
客戶端代碼:
 
WebClient client = new WebClient();
 
sting uriString="http://localhost:3778/Default2.aspx";
string fileName="D:\\1.txt"; //你要給些這個文件路徑
myWebClient.UploadFile(uriString, fileName);
 
 
服務器端:
  private  void Page_Load( object sender, System.EventArgs e)
  {   // 獲取 http提交上傳的文件, 並改名保存
      foreach (string key in Request.Files.AllKeys)
      {
         HttpPostedFile file = Request.Files[key];
         string newFilename = DateTime.Now.ToString("yyMMddhhmmssffff")
                + file.FileName.Substring(file.FileName.LastIndexOf('.'));

            try
            {   //文件保存並返回相對路徑地址
                file.SaveAs(this.serverPath + newFilename);
                Response.Write("upload/" + newFilename);
            }

            catch (Exception)
            {                
            }

        }

    }
 
上傳文件部分請參見 http://www.blogjava.net/kiant/articles/277929.html 。
 


免責聲明!

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



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