对于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 = ;

        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 = ;

            httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

        }

    }

可以将 HttpClientHandler 类与 HttpClient 类结合使用,以设置有关 HTTP 请求的选项。

对于System.Net.Http的学习(二)——使用 HttpClient 进行连接的更多相关文章

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

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

  2. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

  3. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  5. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: S ...

  6. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  7. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  8. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  9. Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发

    一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...

随机推荐

  1. UIImagePickerController在ios10环境一打开就crash的问题

    在之前的系统环境下,UIImagePickerController都可以顺利打开.但是自从手机升级了ios10以后,每次打开相机和照片库都会直接崩溃. 通过google搜索找到StackOverflo ...

  2. Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别

    预备知识:SQLServer的IDENTITY关键字IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:iden ...

  3. 如何使用NodeJs来监听文件变化

    1.前言 在我们调试修改代码的时候,每修改一次代码,哪怕只是很小的修改,我们都需要手动重新build文件,然后再运行代码,看修改的效果,这样的效率特别低,对于开发者来说简直不能忍. 2.构建自动编译工 ...

  4. winAPI 中 的 GlobalLock GlobalUnlock 的作用

    在项目中遇到GlobalLock  GlobalUnlock 这两个操作内存的函数. 百度百科解释为:锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处.除非用 GlobalUnlock ...

  5. css横向导航条

    css横向导航条有两种方法 1. ul li a li{float:left} #navlist li, #navlist a{height:44px;display:block;} a{width: ...

  6. UIAlertController的使用

    在iOS8中,苹果对UIAlertView和UIActionSheet进行了重新的封装,成为适应性更强,灵活性更高的UIAlertController.具体使用方法如下. UIAlertControl ...

  7. 打印文本中的所有单词,并且打印每个单词出现的行号,非实义单词不考虑(TCPL,练习6-3)

    建立一棵二叉树,每个接单存放单词以及指向一个链表的指针,以及指向左右节点的指针.链表内存放行号以及指向下一个链表节点的指针. 每录入一个单词,先寻找二叉树,再寻找它的链表,分别将单词和行号插入二叉树和 ...

  8. Win10 设置外网多用户远程桌面连接

    主要原理:利用路由器的虚拟服务器功能,将内网的Ip地址通过端口映射提供给外网,使得外网能够访问到目的主机. 1. 配置路由器上的虚拟服务器,假设目的主机内网的ip为192.168.1.100,则配置如 ...

  9. java 中 finally里面写了return 会发生什么?

    boolean test() throws Exception { boolean ret = true; try { int b = 12; int c; for (int i = 1; i > ...

  10. 【转载】Fiddler进行模拟Post提交json数据,总为null解决方式

    Request Headers: User-Agent: FiddlerHost: localhost:3248Content-Type: application/json; charset=utf- ...