1.异步调用 Web 服务

static void Main(string[] args)
{
Console.WriteLine("In main before call to GetData!");
GetData();
Console.WriteLine("Back in main after call to GetData!");
Console.ReadKey();
} private static async void GetData()
{
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = null;
response = await httpClient.GetAsync("http://services.odata.org/Northwind/Northwind.svc/Regions");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Response Status Code and Reason Phrase: " + response.StatusCode + " " + response.ReasonPhrase);
string responseBodyAsText = response.Content.ReadAsStringAsync().Result;
Console.WriteLine("Received payload of " + responseBodyAsText.Length + " characters");
//Console.WriteLine(responseBodyAsText);
}
}



来看看下面方法解释:

因为 HttpClient 使用 GetAsync 方法调用,且使用了 await,所以 Main 方法输出到屏幕的消息先显示,而 GetData 调用中的数据后显示。

对 GetAsync 返回一个 HttpResponseMessage 对象。表示包含的标题、状态和内容的响应。检查响应的 IsSuccessStatusCode 属性,可以确定请求是否成功。

2.标题

HttpClient 的 DefaultRequestHeaders 属性允许设置或改变标题。使用 Add 可以给集合添加标题。下面意义相同。

//httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

标题和标题值会与这个 HttpClient 实例发送的每个请求一起发送。

下面的例子说明了如何在响应和请求中遍历标题。

    static void Main(string[] args)
{
GetData();
Console.ReadKey();
} private static void GetData()
{
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = null;
httpClient.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
Console.WriteLine("Request Headers:");
//请求的标题
EnumerateHeaders(httpClient.DefaultRequestHeaders);
Console.WriteLine(); response = httpClient.GetAsync("http://services.odata.org/Northwind/Northwind.svc/Regions").Result;
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Response Headers:");
EnumerateHeaders(response.Headers); //结尾的标题
}
}
  • HttpHeadersHttpRequestHeadersHttpResponseHeaders 的基类。
  • HttpHeaders对象定义的为 KeyValuePair<string, IEnumerable<string>>。这表示每个标题在集合中都可以有多个值。因此要改变标题中的值,就需要先删除原来的值,添加新值。
    private static void EnumerateHeaders(HttpHeaders headers)
{
foreach (var header in headers)
{
var value = "";
foreach (var val in header.Value)
{
value = val + " ";
}
Console.WriteLine("Header: " + header.Key + " Value: " + value);
}
}

因为标题值可以有多个,标题值部分也必须迭代,所以在循环内部还有一个循环,来枚举所有找到的值。

3.HttpContent

响应中的 Content 属性返回一个 HttpContent 对象。例子中使用 ReadAsStringAsync 返回内容的字符串表示。顾名思义,这是一个异步调用,但这个例子没使用异步调用功能。调用 Result 会阻塞该调用,直到 ReadAsStringAsync 方法执行完毕。

	var client = new HttpClient();
//GetAsync 方法也接受一个 CancellationToken
HttpResponseMessage response = await client.GetAsync("http://www.baidu.com");
response.EnsureSuccessStatusCode();
string html = await response.Content.ReadAsStringAsync();
Console.WriteLine(html);

其他从 HttpContent 对象获取数据的方法有 ReadAsByteArrayAsync(返回数据的字节数组)和 ReadAsStreamAsync(返回一个流)。也可以使用 LoadIntoBufferAsync 把内容加载到内存缓存中。

Headers 属性返回 HttpCotentHeaders 对象。它工作方式与前面例子的请求和响应标题相同。

4.HttpMessageHandler

  • 作为 HttpClient 构造函数的参数,就可以定制请求。
  • 默认使用 WebRequestHandler 对象。
  • 有许多属性可以设置 ClientCertificates、Pipelining、CachePolity、ImpersonationLevel 等。
    class Program
{ static void Main(string[] args)
{
GetData();
Console.ReadKey();
} private static void GetData()
{
HttpClient httpClient = new HttpClient(new MessageHandler("error"));
HttpResponseMessage response = null;
Console.WriteLine();
response = httpClient.GetAsync("http://services.odata.org/Northwind/Northwind.svc/Regions").Result;
Console.WriteLine(response.StatusCode);
}
} public class MessageHandler : HttpClientHandler //HttpClientHandler 继承自 HttpMessageHandler
{
string displayMessage = ""; public MessageHandler(string message)
{
displayMessage = message;
} protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
Console.WriteLine("In DisplayMessageHandler " + displayMessage);
if (displayMessage == "error")
{
var response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest); //创建要返回的响应 把状态设置为 BadRequest
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response); //注意响应在 HttpResponseMessage 任务中 SetResult 方法设置
return tsc.Task;
}
return base.SendAsync(request, cancellationToken);
}
}

检查 displayMessage ,是否为“error”。如果是,就创建要返回的响应,把状态设为 BadRequest。接下来只创建了要返回的 Task。注意响应在 HttpResponseMessage 任务中通过 SetResult 方法设置。

添加定制处理器程序有很多理由。设置处理程序管道,是为添加多个处理程序。除了默认的处理程序外,还有 DelegatingHandler,它执行一些代码,再把调用委托给内部或下一个处理程序。 HttpClientHandler 是最后一个处理程序,它把请求发送到地址。

每个添加的 DelegatingHandler都调用下一个或内部的处理程序,最后一个是基于 HttpClientHandler处理程序。

HttpClient 详解一《C#高级编程(第9版)》的更多相关文章

  1. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  2. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway    Phil Haack    Brad Wilson    K. Scott All ...

  3. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  4. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  5. sed命令详解 vim高级技巧 shell编程上

    第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...

  6. android 的android httpClient详解

    AndroidHttpClient结构: public final class AndroidHttpClient extends Object implements HttpClient 前言: 这 ...

  7. extern的使用详解(多文件编程)——C语言

    extern——关键字 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在变量的存储类 ...

  8. Lombok 使用详解,简化Java编程

    前言 在 Java 应用程序中存在许多重复相似的.生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求 比如,在 Java 应用程序开发中,我们几乎要为所有 ...

  9. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

随机推荐

  1. 如何用Delphi开发网游外挂

    1.动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标.键盘等,使游戏里的人物进行流动或者攻击,最早以前的“石器”外挂就是这种方式.2.本地修改式,这种外挂跟传统上的一些游戏修改器没有两样 ...

  2. 如何取消mysql的密码?

    有两种方法: 1.mysql命令 SET PASSWORD FOR root@localhost=PASSWORD(''); 2.运行  mysqladmin 命令 mysqladmin -u roo ...

  3. 【刷题】BZOJ 3495 PA2010 Riddle

    Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边. 要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n& ...

  4. USACO Section 1.4 Mother's Milk 解题报告

    题目 题目描述 有三个牛奶桶,三个桶的容积分别是A,B,C,最小为1,最大为20.刚开始只有第三个桶里面装满了牛奶,其余两个桶都是空的.我们现在可以将第三个桶中的牛奶往其他两个桶里面倒一些牛奶,然后还 ...

  5. jupyter notebook添加Anaconda虚拟环境的python kernel

    之前在自己博客上写了一个如何通过自建配置文件,让jupyter notebook可以调用conda虚拟环境的python解释器. 今天介绍一种更加简单的方式,无需手动配置文件,利用ipykernel可 ...

  6. 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

    高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少     阅读(81374) | 评论(9)收藏16 淘帖1 赞3   JackJiang Lv.9    1 年前 | 前言 曾几何时我 ...

  7. Flink流处理操作符

    一.工程创建与准备 使用maven进行工程创建,且采用提供的flink-quickstart模版,便利很多.

  8. [转载]Windows 8 VHD 概述与使用

    http://www.cnblogs.com/tonycody/archive/2012/11/30/2796858.html

  9. ASP.NET中异常处理的注意事项

    一.ASP.NET中需要引发异常的四类情况 1.如果运行代码后,造成内存泄漏.资源不可用或应用程序状态不可恢复,则引发异常.Console这个类中,有很多类似这样的代码: if ((value < ...

  10. Value = undefined

    Value = undefined Javascript在计算机程序中,经常会声明无值的变量.未使用值来声明的变量,其值实际上是 undefined. 在执行过以下语句后,变量 carname 的值将 ...