WebClient的使用

1、下载网页源码:

   private void button1_Click(object sender, EventArgs e)
        {
            string url = textBox1.Text;
            string toUrl = Application.StartupPath + "\" + Path.GetFileName(url);

            WebClient wc = new WebClient();
           wc.DownloadDataAsync(new Uri(url));
           wc.DownloadDataCompleted += wc_DownloadDataCompleted;
        }

        void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
        {
            if (e.Error == null && e.Cancelled == false)
                textBox2.Text = Encoding.UTF8.GetString(e.Result);
            else
                MessageBox.Show(e.Error.Message);
        }

 2、直接下载文件,比较简单,但下载比较伤硬盘:

        private void button1_Click(object sender, EventArgs e)
        {
            string url = textBox1.Text;
            string toUrl = Application.StartupPath + "\" + Path.GetFileName(url);

            WebClient wc = new WebClient();
            wc.DownloadFileCompleted += wc_DownloadFileCompleted;
            wc.DownloadFileAsync(new Uri(url), toUrl);
        }

        void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("下载完成");
        }

3、利用缓存下载文件,可以更好的保护硬盘

private void button2_Click(object sender, EventArgs e)
        {
            WebClient wc = new WebClient();
            wc.OpenReadAsync(new Uri(textBox1.Text));
            wc.OpenReadCompleted += wc_OpenReadCompleted;
        }
        async void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                await SaveFile(e.Result, Application.StartupPath + "\" + Path.GetFileName(textBox1.Text));
                MessageBox.Show("下载完成");
            }
            else
            {
                MessageBox.Show(e.Error.Message);
            }
        }
        Task SaveFile(Stream stream, string savepath)
        {
            return Task.Run(() =>
              {
                  var read = stream;
                  byte[] buf = new byte[8192];
                  int res = 0;
                  FileStream fs = File.Open(savepath, FileMode.OpenOrCreate);
                  using (fs)
                  {
                      while ((res = read.Read(buf, 0, buf.Length)) > 0)
                      {
                          fs.Write(buf, 0, res);
                          fs.Flush();
                      }
                  }
                  read.Close();
                  read.Dispose();
              });
        }
 

4、上传文件

web网站创建一般处理程序  FileHandler:

public class FileHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            try
            {
                HttpFileCollection files = context.Request.Files;
                if (files.Count > 0)
                {
                    files[0].SaveAs(HttpContext.Current.Server.MapPath("files/" + context.Request.QueryString["fname"]));
                    context.Response.Write("save success!");
                }
                else
                    context.Response.Write("hello request!");
            }
            catch (Exception ex)
            {
                context.Response.Write("save error!" + ex.Message);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

由于网站对上传文件大小有限制,修改上传大小可以在ASP.Net在web.config中设置:

<system.web>
<httpRuntime maxRequestLength="40960"   //即40MB,1KB=1024
useFullyQualifiedRedirectUrl="true"
executionTimeout="6000"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
enableVersionHeader="true"
/>
</system.web>

对于webclient,在winform窗体上点击按钮,则把文件上传到上面的服务器网站目录中。

        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {

                string path = openFileDialog1.FileName;
                WebClient wc = new WebClient();
                wc.Credentials = CredentialCache.DefaultCredentials;
                wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                wc.QueryString["fname"] = openFileDialog1.SafeFileName;
                byte[] fileb = wc.UploadFile(new Uri(@"http://localhost:15993/FileHandler.ashx"), "POST", path);
                string res = Encoding.UTF8.GetString(fileb);
                MessageBox.Show(res);
            }
        }

 5、向服务器发送文字

服务器Test.ashx:

 public class Test : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";

            int len=context.Request.ContentLength;
            var buf=context.Request.BinaryRead(len);
            var res=Encoding.UTF8.GetString(buf);

            context.Response.Write("Result="+res);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

客户机:

        private void button2_Click(object sender, EventArgs e)
        {
            WebClient wc = new WebClient();
            var data = textBox2.Text;

            wc.UploadStringAsync(new Uri("http://localhost:15993/Test.ashx"), "POST", data);
            wc.UploadStringCompleted += wc_UploadStringCompleted;
        }

        void wc_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }

 6、上传表单

服务器端用.net  Controller:

 public ActionResult add(int a,int b)
        {
            int c = a + b;
            return Content(c.ToString()); ;
        }

客户机:

        private void button3_Click(object sender, EventArgs e)
        {
            var data = "a=1&b=2";
            var postData = Encoding.UTF8.GetBytes(data);

            WebClient wc = new WebClient();
            wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            wc.UploadDataAsync(new Uri("http://localhost:15993/home/add"), "POST", postData);
            wc.UploadDataCompleted += wc_UploadDataCompleted;
        }

        void wc_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e)
        {
            MessageBox.Show(Encoding.UTF8.GetString(  e.Result,0,e.Result.Length));
        }
原文地址:https://www.cnblogs.com/lunawzh/p/6832282.html