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)); }