System.Net.Http 是微软推出的最新的 HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容:

1. 用户通过 HTTP 使用现代化的 Web Service 的客户端组件;

2. 能够同时在客户端与服务端同时使用的 HTTP 组件(比如处理 HTTP 标头和消息), 为客户端和服务端提供一致的编程模型。

命名空间 System.Net.Http 以及 System.Net.Http.Headers 提供了如下内容:

1. HttpClient 发送和接收 HTTP 请求与响应;

2. HttpRequestMessage and HttpResponseMessage 封装了 RFC 2616 定义的 HTTP 消息;

3. HttpHeaders 封装了 RFC 2616 定义的 HTTP 标头;

4. HttpClientHandler 负责生成HTTP响应消息的HTTP处理程序。

System.Net.Http 能够处理多种类型的 RFC 2616 定义的 HTTP 实体正文, 如下图所示:

  此外, System.Net.Http 对 HTTP 消息的处理采用了职责链模式, 这里有一遍不错的介绍, 这里就不再多说了。

  System.Net.Http 最早是和 Asp.Net Mvc4 同时出现, 是一个第三方组件,名称是Microsoft HTTP Client Libraries,可以在 .Net 4.0 中使用。 随着 .Net 4.5 的发布, System.Net.Http 正式成为 .Net 基础类库, 目前已经可以在 .Net 4.0/4.5 、 Windows Phone 、 以及 Windows Store App 中使用。

  HttpClient 组件类实例为一个会话发送 HTTP 请求。 HttpClient 实例设置为集合会应用于该实例执行的所有请求。 此外,每 HttpClient 实例使用自己的连接池,隔离其他 HttpClient实例的执行请求。 HttpClient 也是更具体的 HTTP 客户端的基类。

  默认情况下,使用 HttpWebRequest 向服务器发送请求。 这一行为可通过在接受一个HttpMessageHandler实例作为参数的构造函数重载中指定不同的通道来更改。

  如果需要身份验证或缓存的功能,WebRequestHandler 可使用配置项和实例传递给构造函数。 返回的处理程序传递到采用 HttpMessageHandler 参数的某构造进行返回参数传递。

  如果使用 HttpClient 和相关组件类的 app 在 System.Net.Http 命名空间用于下载大量数据 (可达 50 MB 或更多),则应用程序应这些下载的流和不使用默认值缓冲区。 如果使用默认值缓冲区客户端内存使用量会非常大,可能会导致显着降低的性能。

  对于 HttpClient的基本使用方法,示例代码如下:

//声明HttpClient

    HttpClient client = new HttpClient

        {

            BaseAddress = new Uri("http://www.163.com")

        };

//多线程中跨线程进行信息显示委托

public delegate void ShowMsgDelegate(string text);

    public void ShowMsgText(string text)

    {

         txtMsg.Text=text;         

}

//信息显示

    private void ShowMessage(string  msg)

    {

        if (this.InvokeRequired)

        {

            this.Invoke(new ShowMsgDelegate(ShowMsgText), msg);

        }

        else

        {

            ShowMsgText(msg);

        }

    }

// Get form data to server

        private void btnGet_Click(object sender, EventArgs e)

        {

            // Get string from server

            client.GetStringAsync("browserhttp/").ContinueWith(t =>

            {               

                if (t.IsFaulted)

                {

                    ShowMessage("返回信息错误:" + t.Result);                

                }

                else

                {

                                    ShowMessage("成功:" + t.Result);

                   }

            });

        }

// Post form data to server

    private void btnPost_Click(object sender, EventArgs e)

    {

        var param = new Dictionary<string, string> {

   {"Name", "TOM Post"},

   {"Age", ""},

   {"Birthday", DateTime.Now.ToString("yyyyMMdd")}

        };

        client.PostAsync("browserhttp/", new FormUrlEncodedContent(param)).ContinueWith(t =>

        {

            ShowMsgDelegate showmsg = new ShowMsgDelegate(ShowMsgText);

            if (t.IsFaulted)

            {

                ShowMessage("返回信息错误:" + t.Result);

            }

            else

            {

                HttpResponseMessage response = t.Result;

                ShowMessage(response.StatusCode.ToString());

                        }

        });

    }

// PUT to update

private void btnPut_Click(object sender, EventArgs e)

    {

        var param = new Dictionary<string, string> {

   {"Id", "" },

   {"Name", "Tom Post"},

   {"Age", ""},

   {"Birthday", DateTime.Now.ToString("yyyyMMdd")}

};

        client.PutAsync("clienthttp/1", new FormUrlEncodedContent(param)).ContinueWith(t =>

        {

            if (t.IsFaulted)

            {

                ShowMessage("返回信息错误:" + t.Result);              

            }

            else

            {

                HttpResponseMessage response = t.Result;

                ShowMessage(response.StatusCode.ToString());

              }

        });

    }

// DELETE 

    private void btnDel_Click(object sender, EventArgs e)

    {

        client.DeleteAsync("clienthttp/1").ContinueWith(t =>

        {

            if (t.IsFaulted)

            {

                ShowMessage("返回信息错误:" + t.Result);

            }

            else

            {

                HttpResponseMessage response = t.Result;

                ShowMessage(response.StatusCode.ToString());

              }

        });

}

  支持职责链模式的 MessageProcessingHandler ,MessageProcessingHandler - 一种基本的 HTTP 消息处理程序。这是最容易进行派生的处理程序,应该作为大多数自定义处理程序的起点。 自已定义了一个新的MessageProcessingHandler处理程序,如下面的示例代码所示:

public class CustomProcessingHandler : MessageProcessingHandler {

   protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, CancellationToken cancellationToken) {

      if (request.Method != HttpMethod.Get && request.Method != HttpMethod.Post) {

         request.Headers.TryAddWithoutValidation("RequestMethod", request.Method.Method);

         request.Method = HttpMethod.Post;

      }

      return request;

   }

   protected override HttpResponseMessage ProcessResponse(HttpResponseMessage response, CancellationToken cancellationToken) {

      var request = response.RequestMessage;

      if (request.Headers.Contains("RequestMethod")) {

         IEnumerable<string> values;

         if (request.Headers.TryGetValues("RequestMethod", out values)) {

            request.Method = new HttpMethod(values.First());

         }

      }

      return response;

   }

}

  使用起来也是非常简单的:

  private void btnCustom_Click(object sender, EventArgs e)

        {

            var customHandler = new CustomProcessingHandler

            {

                InnerHandler = new HttpClientHandler()

            };

            var client = new HttpClient(customHandler, true)

            {

                BaseAddress = new Uri("http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl")

            };

            var task = client.GetAsync(client.BaseAddress);

            task.Result.EnsureSuccessStatusCode();

            HttpResponseMessage response = task.Result;

            txtStatusCode.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;

            txtStatusText.Text = "请求返回结果如下 ...";

            var result = response.Content.ReadAsStringAsync();         

            txtMsg.Text = result.Result; ;

        }

对于System.Net.Http的学习(一)——System.Net.Http 简介的更多相关文章

  1. 对于System.Net.Http的学习(三)——使用 HttpClient 检索与获取过程数据

    对于System.Net.Http的学习(一)——System.Net.Http 简介 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接 如何使用 HttpCli ...

  2. 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接

    对于System.Net.Http的学习(一)——System.Net.Http 简介  使用 HttpClient 进行连接 使用 System.Net.Http 命名空间中的 HttpClient ...

  3. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  4. Java学习之System.arraycopy()方法

    java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少.System提供 ...

  5. .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    .Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...

  6. foreach statement cannot operate on variables of type 'System.Web.UI.WebControls.Table' because 'System.Web.UI.WebControls.Table' does not contain a public definition for 'GetEnumerator'

    错误:foreach statement cannot operate on variables of type 'System.Web.UI.WebControls.Table' because ' ...

  7. Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, ...

  8. 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项

    参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...

  9. 无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。

    在一个项目中使用LINQ和EF时出现了题目所示的异常,搜索了很多资料都找不到解决办法,主要是因为EF方面的知识欠缺. 先将情况记录如下,以供以后参考. 查询主要设计两张表,由外键关联: 在进行下面的查 ...

  10. Web Service接口返回泛型的问题(System.InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型“System.String[]”)

    在使用C#写Web Service时遇到了个很奇怪的问题.返回值的类型是泛型(我用的是类似List<string>)的接口,测试时发现总是报什么无法转换为对象的错误,百思不得其解. 后来在 ...

随机推荐

  1. hadoop显示ConnectionrRefused

    产生原因重启了服务器 (1)在安装目录/root/cloud/hadoop-2.2.0/ 重新hdfs namenode -format (2) 目录/root/cloud/hadoop-2.2.0/ ...

  2. 领域模型驱动设计(Domain Driven Design)入门概述

    软件开发要干什么: 反映真实世界要自动化的业务流程 解决现实问题 领域Domain Domain特指软件关注的领域 在不能充分了解业务领域的情况下是不可能做出一个好的软件 领域建模 领域模型驱动设计 ...

  3. #知识#室内设计原理ing

    室内设计原理 第一章 室内设计的含义和基本观点 人的一生,绝大部分时间是在室内度过的,因此,人们设计创造的室内环境,必然会直接关系到室内生活.生产活动的质量,关系到人们的安全.健康.效率.舒适等等.室 ...

  4. 前端学习之本地储存与cookie

    今天主要的学习内容是cookie与本地储存的知识, 在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别, ...

  5. [Leetcode][JAVA] Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. 每天记一些php函数,jQuery函数和linux命令(二)

    简介:学习完了php和jQuery之后,对函数的记忆不到位,导致很多函数没记住,所以为了促进自己的记忆,每天花一点时间来写这个博客. 时间:2016-12-19   地点:太原    天气:晴 一.p ...

  7. iptables 四表五链

    netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加.编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则.这些规则存储在专用的信息包过滤表中 ...

  8. PADS从原理图到PCB整体简易流程

    10步完成PADS从原理图到PCB设计 图片有点大,可以点击观看. 第一步:启动PADS LOGIC 第二步:添加元器件 第三步:选择2个9脚接插头放置在原理图上 第四步:添加连线. 完成后如图 第五 ...

  9. 【原创】还原Hyper-V 到一个新的虚拟机

    Context: I need to restore VM31 backup (via 'Windows Server Backup' tool) as another new Hyper-V mac ...

  10. 需要知道关于struct的一些事情

    前言 重构代码的时候,会遇到长参数的方法,此时就需要使用“引入参数对象”来封装这些参数.大多数时候,这些参数都是简单类型,而且所有参数的值占用的空间也不是非常的大,此时使用对象真的好吗?对象的特性是堆 ...