WebApi系列~对HttpClient的响应流进行解压

有时我们的请求头为ContentEncoding添加了gzip进行了压缩,而服务端返回数据时也会对它进行gzip压缩,如果在这种情况下,你直接头响应流会是乱码,而必须先进行压缩,大叔将这块的逻辑进行了抽取,它把抽取到了方法里,自动使用这个功能!

        /// <summary>
        /// 对流进行解压
        /// </summary>
        /// <param name="response"></param>
        static void UnGZip(HttpResponseMessage response)
        {
            bool isGzip = response.Content.Headers.ContentEncoding.Contains("gzip");
            if (isGzip)
            {
                Stream decompressedStream = new MemoryStream();
                using (var gzipStream = new GZipStream(response.Content.ReadAsStreamAsync().Result, CompressionMode.Decompress))
                {
                    gzipStream.CopyToAsync(decompressedStream);
                }
                decompressedStream.Seek(0, SeekOrigin.Begin);

                var originContent = response.Content;
                response.Content = new StreamContent(decompressedStream);
            }
        }

在GET,POST,PUT,DELETE方法的响应流时,进行装饰,把流进行解压即可!

        public static T Post<T>(string url, object argument = null, CookieContainer cookieContainer = null)
        {
            string sret = "";
            if (cookieContainer == null)
                cookieContainer = new CookieContainer();
            using (HttpClientHandler clientHandler = new HttpClientHandler() { CookieContainer = cookieContainer })
            using (HttpClient client = new HttpClient(clientHandler))
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                string sargument = Newtonsoft.Json.JsonConvert.SerializeObject(argument);
                StringContent argumentContent = new StringContent(sargument, Encoding.UTF8, "application/json");
                HttpResponseMessage response = client.PostAsync(url, argumentContent).Result;
                if (response.IsSuccessStatusCode)
                {
                    UnGZip(response);
                    sret = response.Content.ReadAsStringAsync().Result;
                }
                else
                {
                 throw new Exception(response.StatusCode.ToString());
                }
                if (!string.IsNullOrEmpty(sret))
                {

                    T ret = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(sret);
                    return ret;
                }
                else
                {
                    return default(T);
                }
            }
        }

这样你的响应流就被解开了!

挺方便!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:WebApi系列~对HttpClient的响应流进行解压,如需转载请自行联系原博主。

时间: 2024-10-14 17:27:04

WebApi系列~对HttpClient的响应流进行解压的相关文章

WebApi系列~HttpClient的性能隐患

最近在进行开发过程中,基于都是接口开发,A站接口访问B接口接口来请求数据,而在这个过程中我们使用的是HttpClient这个框架,当然也是微软自己的框架,性能当前没有问题,但如果你直接使用官方的写法,在高并发时候,会有很大的性能隐患,因为它官方使用的是using的方式,而对于请求量比较大时,这种方法对TCP建立也会过高,即使用完马上释放也会有很多time_out的请求,所有决定把某个用到httpclient的组件做成静态化的! 明细 统计 调用,中规中矩的写法 using (var http =

ASP写入响应流的最高效率测试结果

响应|响应 本篇教程主要介绍:将ASP生成的内容写入响应流中最有效的方法,即用 Response.Write 和 <%=%> 向客户端输出内容时的效率测试. 使用ASP的一个最主要原因是在服务器上生成动态内容.所以很明显,我们测试的起点是确定将动态内容发送到响应流中的最适合的方式. 在多种选择中,有两个是最基本的:一是使用内联ASP标记,另一个是使用Response.Write 语句. 为测试这些选择,我们创建了一个简单的ASP页面,其中定义了一些变量,然后将它们的值插入表格中.虽然这个页面很

将ASP生成的内容写入响应流中最有效的方法

刚开始学ASP时,照书里HTML中包含ASP后来,用Response.Write 输出HTML可现在看了这一篇文章,难道真的要把Response.Write写成一句(" & _?你说说?-------(转http://www.ccidnet.com/html//tech/web/2000/11/10/58_1298.html)什么才是提高ASP性能的最佳选择(一)(作者:青苹果工作室编译 2000年11月10日 17:20) 将ASP生成的内容写入响应流中最有效的方法是什么? 使用ASP

灌第二篇:将ASP生成的内容写入响应流中最有效的方法是什么?(转)

响应 刚开始学ASP时,照书里HTML中包含ASP后来,用Response.Write 输出HTML可现在看了这一篇文章,难道真的要把Response.Write写成一句(" & _?你说说?-------(转http://www.ccidnet.com/html//tech/web/2000/11/10/58_1298.html)什么才是提高ASP性能的最佳选择(一)(作者:青苹果工作室编译 2000年11月10日 17:20) 将ASP生成的内容写入响应流中最有效的方法是什么? 使用

将ASP生成的内容写入响应流中最有效的方法是什么?

响应 刚开始学ASP时,照书里HTML中包含ASP后来,用Response.Write 输出HTML可现在看了这一篇文章,难道真的要把Response.Write写成一句(" & _?你说说?-------(转http://www.ccidnet.com/html//tech/web/2000/11/10/58_1298.html)什么才是提高ASP性能的最佳选择(一)(作者:青苹果工作室编译 2000年11月10日 17:20) 将ASP生成的内容写入响应流中最有效的方法是什么? 使用

如何将ASP生成的内容写入响应流中

       将ASP生成的内容写入响应流中最有效的方法是什么?   使用ASP的一个最主要原因是在服务器上生成动态内容.所以很明显,我们测试的起点是确定将动态内容发送到响应流中的最适合的方式.在多种选择中,有两个是最基本的:一是使用内联ASP标记,另一个是使用Response.Write 语句.  为测试这些选择,我们创建了一个简单的ASP页面,其中定义了一些变量,然后将它们的值插入表格中.虽然这个页面很简单也不是很实用,但它允许我们分离并测试一些单独的问题.  使用ASP内联标记  第一个测

输出流,响应流,以及输出响应流的关系

问题描述 查看msdn的,它说明Response.BinaryWrite是写入输出流,Response.Write(Object)是写入到响应流,而Response.Write(String)则是写入到输出响应流,我基础不是很牢,求解他们之间的关系.给我链接自己看也行,拜托了~ 解决方案 本帖最后由 kj86345580 于 2015-05-15 15:47:22 编辑解决方案二:只要知道其本质就是输出字节流就行,如果不是直接输出字节流,那就存在一个转换的方法,区别就在这里.解决方案三:从你贴的

C# 文件流压缩解压

/// <summary> /// 文件流压缩解压 /// </summary> public class ZipHelper { public static int BEST_COMPRESSION = 9; public static int BEST_SPEED = 1; public static int DEFAULT_COMPRESSION = -1; public static int NO_COMPRESSION = 0; #region Deflate压缩 #re

剑指offer系列之五十三:字符流中第一个不重复的字符

题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是"l". 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符. 这题与前面的第一个不重复的字符有些重复了,所以直接看代码(已被牛客AC): package com.rhwayfun.offer; impor