07
2014
06

WebClient类 详细使用教程


如果只想从特定的URI请求文件,则可以使用的最简单.NET基类就是System.Net.WebClient。这个类是非常高层的类,它主要用于执行带有一个或两个命令的操作。.NET Framework目前支持以http:、https:和file:标识符开头的URI。

注意:
术语URL(统一资源定位符)在新的技术规范中已不再使用,现在使用的是URI(统一资源标识符)。URI的含义大致与URL相同,但URI更通用,因为它不隐含正在使用的协议,如HTTP或FTP。

WebClient提供四种将数据上载到资源的方法:
OpenWrite 返回一个用于将数据发送到资源的 Stream。
UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
UploadValues 将 NameValueCollection 发送到资源并返回包含任何响应的字节数组。


另外WebClient还提供三种从资源下载数据的方法:
DownloadData 从资源下载数据并返回字节数组。
DownloadFile 从资源将数据下载到本地文件。
OpenRead 从资源以 Stream 的形式返回数据。




 

31.1.1  下载文件

使用WebClient类从Web站点下载文件时有两种方法,具体使用哪一种方法取决于文件内容的处理方式。如果只想把文件保存到磁盘上,就应该调用DownloadFile()方法。这个方法有两个参数:即文件的URI和保存所请求的数据的位置(路径和文件名):

WebClient Client = new WebClient();
Client.DownloadFile("http://www.Wrox.com/index.asp", "index.htm");

更为常见的是,应用程序需要处理从Web站点检索到的数据。为此,要使用OpenRead()方法,这个方法返回一个Stream引用。然后,就可以把数据从数据流中提取到内存中:

WebClient Client = new WebClient();
Stream strm = Client.OpenRead("http://www.xx.com/default.asp");
 
31.1.2  基本的Web客户示例

第一个示例将阐述怎样使用WebClient.OpenRead()方法。在这个示例中,我们将把下载的页面显示在ListBox控件中。把项目创建为标准的Windows C#应用程序,添加一个名为listBox1的列表框,将其docking 属性设置为DockStyle.Fill。在文件的开头,需要在using指令中添加System.Net和System.IO命名空间,然后对主窗体的构造函数进行以下改动:

public Form1()
{
   InitializeComponent();
   System.Net.WebClient Client = new WebClient();
   Stream strm = Client.OpenRead("http://www.xx.com");
   StreamReader sr = new StreamReader(strm);
   string line;
   while ( (line=sr.ReadLine()) != null )
   {
      listBox1.Items.Add(line);
   }
   strm.Close();
}

在这个示例中,把System.IO命名空间的StreamReader类与网络数据流关联起来。这样,就可以使用更加有效的高层方法,例如ReadLine()方法,从数据流中以文本的形式获取数据。第30章讨论了把数据移动抽象化为数据流概念的优点,这个示例就充分体现出了这些优点。

在WebClient类中还有一个方法OpenWrite(),它可以返回一个可写的数据流,并把数据发送给URI。也可以指定该方法用于把数据发送给主机;默认的方法是POST。下面的代码段假定在本地机器上有一个可写的目录accept,这段代码在该目录下创建文件newfile.txt,其内容为"Hello World":

WebClient webClient = new WebClient();
Stream stream = webClient.OpenWrite("http://localhost/accept/newfile.txt","PUT");
StreamWriter streamWriter = new StreamWriter(stream);
streamWriter.WriteLine("Hello World");
streamWriter.Close();


31.1.3 异步调用通过WebClient方式去获取资源文件

 

        private void button1_Click(object sender, RoutedEventArgs e)
        {
             //通过WebClient方式去获取资源文件
             Uri uri = new Uri("
http://localhost:2052/Images/cnblogs.png", UriKind.Absolute);
             WebClient webClient = new WebClient();
             webClient.OpenReadAsync(uri);
             webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
            
         }
         void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
         {
             Stream stream = e.Result; 
             BitmapImage bitmap = new BitmapImage();
             bitmap.SetSource(stream);
             this.image1.Source = bitmap;
         }





如果是用WebRequest方式来获取资源的话,主要的代码如下:


  private void Button_Click(object sender, RoutedEventArgs e)
        {
             HttpWebRequest request =(HttpWebRequest) WebRequest.Create("
http://localhost:2052/Images/cnblogs.png");
             request.Method = "GET";
             request.BeginGetResponse(new AsyncCallback(ReadCallback), request);
        }
        public void ReadCallback(IAsyncResult asyc)
        {
            HttpWebRequest request = (HttpWebRequest)asyc.AsyncState;       
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc);

this.Dispatcher.BeginInvoke(() =>
                     {
                         Stream stream = response.GetResponseStream();
                         BitmapImage bitmap = new BitmapImage();                     
                bitmap.SetSource(stream);
                         this.image1.Source = bitmap;
                     }
                     );
         }

 

 



 


31.1.4  上传文件

WebClient类还提供了UploadFile()方法和UploadData()方法。UploadFile()方法用于把指定的文件上传到指定的位置,其中的文件名已经给出;而UploadData()方法用于把二进制数据上传至指定的URI,那些二进制数据是作为字节数组提供的(还有一个DownloadData()方法,用于从URI中检索字节数组):

WebClient client = new WebClient();
client.UploadFile("http://www.ourwebsite.com/NewFile.htm", "C://WebSiteFiles//NewFile.htm");
byte [] image;
// code to initialise image so it contains all the binary data for
// some jpg file
client.UploadData("http://www.ourwebsite.com/NewFile.jpg", image);

 

 

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。