使用 HttpClient 进行连接
对于System.Net.Http的学习(二)——使用 HttpClient 进行连接
对于System.Net.Http的学习(一)——System.Net.Http 简介
使用 HttpClient 进行连接
使用 System.Net.Http 命名空间中的 HttpClient 类可以向 WebService发送 POST与GET 请求并检索响应数据。
System.Net.Http 命名空间中的类可为现代 HTTP 应用提供编程接口。System.Net.Http 命名空间和相关的 System.Net.Http.Headers 命名空间提供的 HTTP 客户端组件,允许用户通过 HTTP 使用现代的 WebService。
HttpClient 类用于通过 HTTP 发送和接收基本要求。它提供了一个用于从 URI 所标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。该类可用来向 Web Service发送 GET、PUT、POST、DELETE 以及其他请求。上述每种请求都作为异步操作进行发送。
HttpResponseMessage 类用于声明从 HTTP 请求接收到的 HTTP 响应消息。HTTP 消息由 IETF 在 RFC 2616 中进行定义。
HttpContent 类是用于声明 HTTP 实体正文和内容标题的基类。 在这种情况下,HttpContent 用于声明 HTTP 响应。
以下示例使用 .NET Framework 4.0 的 C#。同时你必须对 RFC 2616 中详细描述的 HTTP 请求有基本的了解。
一、 创建新项目
1. 打开 Microsoft Visual Studio 2010,然后从“文件”菜单中选择“新建项目”。在模板列表中,选择 Visual C#。在该区域下面,选择“Windows 应用程序应用”,然后选择“空白应用程序”。将该应用程序命名为 winHttpClientBase,然后单击“确定”。
2. 添加Microsoft HTTP Client Libraries的引用如下图1,图2,图3,图4。
图1
图2
图3
图4
二、设置启用网络访问的功能
需要为应用设置网络功能,以启用家庭网络或工作网络以及 Internet 的访问。你需要为你的应用启用网络功能,因为客户端需要连接到因特网上的 Web Service。
对于使用 HttpClient 连接到另一台计算机上 Web Service的应用,该应用将需要设置网络功能。
三、添加 Windows 控件
在本小节中,我们将在添加显示数据的控件和内容,每个控件的大小和位置,我们的用户界面如下。
本示例使用了简单的 Windows 控件,包括:
o 包含Label 标签、输入 URI 地址的 TextBox和用于启动异步请求的Button(请求) 。
o 包一个显示状态与状态代码的两个Lable与TextBox。
o 包一个显示请求结果的TextBox。用于显示从 Web 服务接收到的信息。在此示例中,HTTP GET 操作的结果会以包含 HTML 标记的纯文本显示。
四、创建 HttpClient,发送 GET 请求并检索响应
以下代码将首先创建 HttpClient 对象。
1. 首先创建 HttpClient 对象。我们还在 HttpClient 对象上设置两个属性。
HttpClient.MaxResponseContentBufferSize 属性的默认值是整数的最大值。为了限制应用作为来自 Web 服务的响应接受的数据量,我们将此属性设置为一个较小的值。
默认情况下,HttpClient 对象不会将用户代理标识头随 HTTP 请求一起发送到 Web 服务。某些 HTTP 服务器(包括某些 Microsoft Web 服务器)要求从客户端发送的 HTTP 请求附带用户代理标识头,并且如果没有标识头,则返回错误。为了避免这些错误,使用 HttpClient.DefaultRequestHeaders 属性添加了用户代理标头。
2. 打开 Form1.cs 文件。然后将如下代码添加到该文件中。

private void btnRequest_Click(object sender, EventArgs e) { Init(); } private HttpClient httpClient; public void Init() { this.InitializeComponent(); httpClient = new HttpClient(); // Limit the max buffer size for the response so we don't get overwhelmed httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); }

3. 发送 GET 请求并检索响应。
在单击“请求”按钮之后, txtStatusText和 txtMsg文本框中的文本将被更新,然后应用程序使用txtUrl文本框中的 URI 地址发送 HTTP GET 请求并等待响应。如果发生错误或异常,结果会显示在 txtStatusText文本框中。如果没有错误发生,则来自该 Web 服务的响应将显示在 txtMsg文本框中。
如果是使用vs 2012与net 4.5 则可以在 C# 和 Visual Basic 中使用 await 关键字时,发送 GET 请求并异步检索响应的代码与我们用于同步完成该操作的代码相似。只有在该方法被定义为 async 时,才能使用 await 关键字。
如果 Web 服务器返回 HTTP 错误状态代码,则 HttpResponseMessage.EnsureSuccessStatusCode 方法将引发异常。 如果发生错误,则对任何异常使用 try/catch 块,并在 txtStatusText 文本框中显示异常信息。在 try 块中,显示 Web 服务所返回的状态(txtStatusText)和状态代码(txtStatusCode)。
HttpResponseMessage.Content 属性声明 HTTP 响应的内容。HttpContent.ReadAsStringAsync 方法将 HTTP 内容作为异步操作写入到字符串中。 为了方便显示,我们将所返回的 HTML 文本中的所有 <br> 标记都替换成了新行。

private void GetHtml() { try { string responseBodyAsText; txtMsg.Text = ""; txtStatusText.Text = "Waiting for response ..."; var task = httpClient.GetAsync(new Uri(txtUrl.Text)); task.Result.EnsureSuccessStatusCode(); //var result = task.Result.Content.ReadAsStringAsync(); HttpResponseMessage response = task.Result; txtStatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine; var result = response.Content.ReadAsStringAsync(); responseBodyAsText = result.Result; responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines txtMsg.Text = responseBodyAsText; } catch (HttpRequestException hre) { txtStatusText.Text = hre.ToString(); } catch (Exception ex) { // For debugging txtStatusText.Text = ex.ToString(); } }

如果使用 System.Net.Http 命名空间中的 HttpClient 和相关类的应用用于下载大量数据(50M 或更多),则该应用应流式传输这些下载内容并且不使用默认缓冲。如果使用了默认缓冲,则客户端内存使用量将变得非常大,这可能会导致大幅度降低性能。
当 HttpClient 类和相关类的成员检测到无效的统一资源标识符 (URI) 时,则将引发 UriFormatException 此例外不可以在 Windows 应用商店应用中使用。若要在这种情况下捕获此例外,请为 FormatException 编写捕获语句。
五、小结
在本文中,我们已了解如何使用 HttpClient 类向 Web 服务发送 GET 请求以及如何使用 HttpResponseMessage 和 HttpContent 类检索响应。
HttpClientBasic 完整示例

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnRequest_Click(object sender, EventArgs e) { Init(); GetHtml(); } private void GetHtml() { try { string responseBodyAsText; txtMsg.Text = ""; txtStatusText.Text = "等待请求返回 ..."; var task = httpClient.GetAsync(new Uri(txtUrl.Text)); task.Result.EnsureSuccessStatusCode(); HttpResponseMessage response = task.Result; txtStatusCode.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine; txtStatusText.Text = "请求返回结果如下 ..."; var result = response.Content.ReadAsStringAsync(); responseBodyAsText = result.Result; responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines txtMsg.Text = responseBodyAsText; } catch (HttpRequestException hre) { txtStatusText.Text = hre.ToString(); } catch (Exception ex) { // For debugging txtStatusText.Text = ex.ToString(); } } private HttpClient httpClient; public void Init() { httpClient = new HttpClient(); httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); } }

可以将 HttpClientHandler 类与 HttpClient 类结合使用,以设置有关 HTTP 请求的选项。
使用 HttpClient 进行连接的更多相关文章
- 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接
对于System.Net.Http的学习(一)——System.Net.Http 简介 使用 HttpClient 进行连接 使用 System.Net.Http 命名空间中的 HttpClient ...
- httpclient httpclient使用连接池
httpclient使用连接池 http协议是无状态的,但毕竟是基于tcp的,底层还是需要和服务器连接的, 对于需要从同一个站点抓取大量网页的程序,应该使用连接池,否则每次抓取都和web站点建立连接, ...
- 转 HttpClient 设置连接超时时间
要: HttpClient 4.5版本升级后,设置超时时间的API又有新的变化,请大家关注. HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳 ...
- HttpClient设置连接超时时间
https://www.cnblogs.com/winner-0715/p/7087591.html 使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间.这两个参数很重要,目的是为 ...
- httpclient 释放连接的问题 Invalid use of SingleClientConnManager: connection still allocated
Invalid use of SingleClientConnManager: connection still allocated httpPost.releaseConnection(); 该代 ...
- HttpClient 基于连接池的使用
场景:调用外部系统接口的http请求 要求: 1:可能是http请求,也可能是https请求 2:需要加入连接池的概念,不能每次发起请求都新建一个连接(每次连接握手三次,效率太低) 准备使用httpc ...
- httpclient: 设置连接池及超时配置,请求数据:PoolingHttpClientConnectionManager
public static void main(String[] args) throws Exception{ //httpclient连接池 //创建连接池 PoolingHttpClientCo ...
- HttpClient 释放连接
Release the Connection:释放连接 This is a crucial step to keep things flowing. We must tell HttpClient t ...
- 通过HttpClient方式连接网络
xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
随机推荐
- Unity该插件NGUI学习(1)—— 环境结构
Unity官方网站http://unity3d.com/unity/download下载最新版本4.5.4 发现在神圣的论坛裂纹(Windows)版本号http://game.ceeger.com/f ...
- txt 开关 csv 可通用 工具
Ruby Txt 开关 CSV 常用工具 to require 'csv' namespace :sys_file_conver do desc "把txt数据导入到csv中" t ...
- 玩转Vim-札记
玩转Vim-札记 距上篇博文已有一周有余,上次主要介绍了编辑器之神Vim的起源.安装并介绍了两种模式以及一些简单的操作.本次将继续对Vim的使用进行介绍. 登堂入室 首先接着说移动吧: 1 0 → 数 ...
- 【Java编码准则】の #12不要使用不安全或者强度弱的加密算法
安全性要求高的应用程序必须避免使用不安全的或者强度弱的加密算法,现代计算机的计算能力使得攻击者通过暴力破解能够攻破强度弱的算法.比如,数据加密标准算法DES是极度不安全的,使用类似EFF(Electr ...
- 内网穿透&UDP打洞
这两天找度度重新回忆了一下关于内网穿透的事情,在百度文库上找到了两三篇写的比较通俗易懂的文章,把内网穿透做个简单总结. 首先文章建议 Cone NAPT 还有希望,要是 Symmetri NAPT 就 ...
- iOS_文章3党库SDWebImage
1,下载的文章3党库SDWebImage代码包增加到project 2,进入project的Build Phases,将源代码包里面的所有.m文件所有加入到project 3,导入第3方类库依赖的两个 ...
- 常见浏览器扩展开发笔记(chrome firefox 360 baidu qq sougou liebao uc opera)
浏览器扩展开发貌似时下很冷门啊,但是不少企业还是有类似的应用,360的抢票插件啊,笔者最近在做的网页翻译扩展之类的.笔者在开发的过程中,遇到了不少坑,说是坑,说白了就是各个厂商支持的API不统一导致的 ...
- [Openstack] Expecting an auth URL via either --os-auth-url or env[OS_AUTH_URL]
直接使用devstack在ubuntu14.04单个节点的建筑openstack 使用keystone查询租户和用户始终报告时,这个错误! 主要看下这些配置是否正确.我们将能够解决这个问题 opens ...
- Swift编程语言学习4.1——周期
Swift它提供了类似 C 流量控制结构语言,它包含运行多个任务的能力for和while周期.选择根据不同的编码分支机构的具体条件来运行if和switch声明,有控制流程跳转到其他代码break和co ...
- C和Java中数组的定义
在学习C和Java中,关于数组的定义两者不同,在初学的时候,容易产生混淆,现在将两者对比下. 1.初始化 在C语言中,关于一维数组的定义: 完全初始化 int a[5]={1,2,3,4,5},对于 ...