using ( var wc = new System.Net.WebClient() ) {var imagebytes = wc.DownloadData( hag.ImagePath );using ( MemoryStream ms = new MemoryStream( imagebytes ) ) {picImage.Image = Image.FromStream( ms );}
}

C#中HttpWebRequest、WebClient、HttpClient的使用

HttpWebRequest:

命名空间: System.Net,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。

     //POST方法public static string HttpPost(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";Encoding encoding = Encoding.UTF8;byte[] postData = encoding.GetBytes(postDataStr);request.ContentLength = postData.Length;Stream myRequestStream = request.GetRequestStream();myRequestStream.Write(postData, 0, postData.Length);myRequestStream.Close();HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, encoding);string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}//GET方法public static string HttpGet(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}

WebClient:

命名空间System.Net,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少。

public class WebClientHelper{public static string DownloadString(string url){WebClient wc = new WebClient();//wc.BaseAddress = url;   //设置根目录wc.Encoding = Encoding.UTF8;    //设置按照何种编码访问,如果不加此行,获取到的字符串中文将是乱码string str = wc.DownloadString(url);return str;}public static string DownloadStreamString(string url){WebClient wc = new WebClient();wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36");Stream objStream = wc.OpenRead(url);StreamReader _read = new StreamReader(objStream, Encoding.UTF8);    //新建一个读取流,用指定的编码读取,此处是utf-8string str = _read.ReadToEnd();objStream.Close();_read.Close();return str;}public static void DownloadFile(string url, string filename){WebClient wc = new WebClient();wc.DownloadFile(url, filename);     //下载文件}public static void DownloadData(string url, string filename){WebClient wc = new WebClient();byte [] bytes = wc.DownloadData(url);   //下载到字节数组FileStream fs = new FileStream(filename, FileMode.Create);fs.Write(bytes, 0, bytes.Length); fs.Flush();fs.Close();}public static void DownloadFileAsync(string url, string filename){WebClient wc = new WebClient();wc.DownloadFileCompleted += DownCompletedEventHandler;wc.DownloadFileAsync(new Uri(url), filename);Console.WriteLine("下载中。。。");}private static void DownCompletedEventHandler(object sender, AsyncCompletedEventArgs e){Console.WriteLine(sender.ToString());   //触发事件的对象Console.WriteLine(e.UserState);Console.WriteLine(e.Cancelled);Console.WriteLine("异步下载完成!");}public static void DownloadFileAsync2(string url, string filename){WebClient wc = new WebClient();wc.DownloadFileCompleted += (sender, e) =>{Console.WriteLine("下载完成!");Console.WriteLine(sender.ToString());Console.WriteLine(e.UserState);Console.WriteLine(e.Cancelled);};wc.DownloadFileAsync(new Uri(url), filename);Console.WriteLine("下载中。。。");}}

HttpClient:

HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为 System.Net.Http ,.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同目的。HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易。它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。HttpClient有预热机制,第一次进行访问时比较慢,所以不应该用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例

单例模式:

单例模式(Singleton Pattern)这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例创建步骤:1、定义静态私有对象;2、定义私有构造函数;3、提供公共获取对象方法;

单例模式一般分为两种实现模式:懒汉模式、饿汉模式(以下为Java代码实现)

懒汉模式:  默认不会实例化,什么时候用什么时候new

public class Singleton {  private static Singleton instance = null;  private Singleton (){}  public static Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }
}

这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作

饿汉模式:  类初始化时,会立即加载该对象,线程天生安全,调用效率高

public class Singleton {  private static Singleton instance = new Singleton();  private Singleton (){}  public static Singleton getInstance() {  return instance;  }
}

双检锁/双重校验锁(DCL,即 double-checked locking):这种方式采用双锁机制,安全且在多线程情况下能保持高性能

public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }
}

HttpClient:

public class HttpClientHelper{private static readonly object LockObj = new object();private static HttpClient client = null;public HttpClientHelper() {GetInstance();}public static HttpClient GetInstance(){if (client == null){lock (LockObj){if (client == null){client = new HttpClient();}}}return client;}public async Task<string> PostAsync(string url, string strJson)//post异步请求方法{try{HttpContent content = new StringContent(strJson);content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");//由HttpClient发出异步Post请求HttpResponseMessage res = await client.PostAsync(url, content);if (res.StatusCode == System.Net.HttpStatusCode.OK){string str = res.Content.ReadAsStringAsync().Result;return str;}elsereturn null;}catch (Exception ex){return null;}}public string Post(string url, string strJson)//post同步请求方法{try{HttpContent content = new StringContent(strJson);content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");//client.DefaultRequestHeaders.Connection.Add("keep-alive");//由HttpClient发出Post请求Task<HttpResponseMessage> res = client.PostAsync(url, content);if (res.Result.StatusCode == System.Net.HttpStatusCode.OK){string str = res.Result.Content.ReadAsStringAsync().Result;return str;}elsereturn null;}catch (Exception ex){return null;}}public string Get(string url){try{var responseString = client.GetStringAsync(url);return responseString.Result;}catch (Exception ex){return null;}}}

HttpClient有预热机制,第一次请求比较慢;可以通过初始化前发送一次head请求解决:

_httpClient = new HttpClient() { BaseAddress = new Uri(BASE_ADDRESS) };//帮HttpClient热身_httpClient.SendAsync(new HttpRequestMessage {Method = new HttpMethod("HEAD"), RequestUri = new Uri(BASE_ADDRESS + "/") }).Result.EnsureSuccessStatusCode();

三者区别列表:

C#-WebClient相关推荐

  1. java rest httpclient_java http请求建议使用webClient,少用RestTemplate,不用HttpClient

    简介: webClient:是Spring-webFlux包下的,非阻塞响应,最低java8支持函数式编程,性能好 RestTemplate:是Spring-webmvc包下的,满足RestFul原则 ...

  2. 利用WebClient和WebRequest类获得网页源代码C#

    作者:不详       请速与本人联系 GetPageHtml.aspx <%@ Page language="c#" validateRequest = "fal ...

  3. 使用Silverlight2的WebClient下载远程图片

    在Silverlight 2之前有一个Downloader对象,开发者一般使用Downloader下载图片和文体文件,这个对象在Silverlight 2中作为了一个特性被集成到WebClient类之 ...

  4. WebClient UI和Tomcat的启动器

    WebClient UI 我们在WebClient UI的开发工具里点了Test按钮, 会在浏览器以测试模式打开选中的view.这背后发生了什么事?注意浏览器地址栏的bspwd_cmp_test,这是 ...

  5. 解决.net webservice的WebClient或HttpWebRequest首次连接缓慢问题

    [编程环境]Visual Studio 2010, NET4.0 [开发语言]C#, 理论上VB.NET等依赖.NET Framework框架的语言均受此影响 [问题描述] 使用HttpWebRequ ...

  6. WebClient.UploadValues Post中文乱码的解决方法

    使用WebClient.UploadValues Post中文时,会出现乱码的情况,设置Encoding属性不起作用,设置content-type也不起作用,最后只好自己用WebRequest来做: ...

  7. 利用WebClient发送一个简单的HTTP GET请求并且取回响应

    问题 如何发送一个简单的HTTP GET请求并且取回相应的HTTP响应. 设计 创建一个WebClient类的实例,然后使用它的DownloadData()方法. 方案 string uri = &q ...

  8. C# 发送Http请求 - WebClient类

    WebClient位于System.Net命名空间下,通过这个类可以方便的创建Http请求并获取返回内容. 一.用法1 - DownloadData string uri = "http:/ ...

  9. MDaemon 10.1.2 通过Webclient发邮件时,提示“发邮件时发生错误

    MDaemon 10.1.2 通过Webclient发邮件时,提示"发邮件时发生错误",经查发现服务里边有个Simple mail transfer protocol 服务被启用, ...

  10. webClient 利用代理连接Rss资源

    在做ScreenSaver的StartKit时,RSS源总报无效. 看错误是 程服务器返回错误: (407) 需要代理身份验证 才明白原来是公司上网用的是代理: 怎么样给WebClient加上代理呢? ...

最新文章

  1. 谈asp.net解决方案的项目生成时的输出路径
  2. Java开发者需要了解的移动开发编程语言
  3. QTP的那些事--学习QTP必备的网站整理
  4. sand.A java_java中volatile关键字的含义(转)
  5. restful java客户端_如何在Java客户端调用RESTful服务
  6. Android—开发过程中的相关注意事项
  7. poj1062 Bellman 最短路应用
  8. 操作系统,你搞定了没?
  9. 浅谈,JavaScript 运行机制和Event Loop
  10. 大数据之-Hadoop完全分布式_集群的启动和停止方式总结---大数据之hadoop工作笔记0039
  11. Teamcenter 入门开发系列问答(2)
  12. Springboot下使用WebSocket和浏览器进行长连接通信
  13. 如何判别你的领导是否值得跟随?这几点帮你快速看清
  14. Kafka和Unix管道的示例
  15. cve20190708补丁的kb名称_kb4499175补丁下载
  16. 关于AE(AfterEffect)安装QuickTime后无法渲染H.264,出现报错问题的解决!!错误代码(-1610153459)
  17. Redis集群搭建(单设备,多设备)
  18. CH341应用升级为CH347软硬件注意事项
  19. 警告: A docBase D:\apache-tomcat-8.5\webapps\webapps\projectname inside the host appBase has been
  20. 中药图片拍照识别系统全套开源

热门文章

  1. 回收站清空数据恢复,原来是这么简单
  2. centos上给redis设置密码
  3. Unity游戏运行资源的制作与下载
  4. 将纯色背景的图片转换为背景透明的图片--网站
  5. 博物馆智慧化建设创新实践
  6. 我让小屋更漂亮计算机教案,大班语言快乐的小屋教案
  7. 非常实用的微信新功能,你都知道如何用吗?
  8. 根据现有的API接口将获取JSON数据写入数据库
  9. Hadoop01-入门集群环境搭建
  10. 重写hashcode和equals方法