这两天,遇到了一个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 。