首页 新闻 会员 周边

着急!!在MVC中怎样把gzip压缩的数据,同样的样子返回到前台???

0
悬赏园豆:40 [已解决问题] 解决于 2017-06-30 11:47

mvc作为接口A,它post请求另一个接口B,获取到的数据是GZIP的,也能获取到头信息的content-encoding,现在问题是怎样把从B获取的压缩数据同样原封不动的发布出去??

我给接口A的response添加了content-encoding 头信息后,提示无任何数据响应,所以请帮助解决如果把请求的gzip数据以同样方式和头信息发布出去?感谢各位

寂寞的博客的主页 寂寞的博客 | 初学一级 | 园豆:57
提问于:2017-06-29 15:49
< >
分享
最佳答案
0

 直接用流压。接口A中, 把post接口B得到的stream写入接口A的response中。所谓的接口代理,透传大约就这个意思了

收获园豆:20
czd890 | 专家六级 |园豆:14412 | 2017-06-29 15:55

可是这个mvc的action需要返回ContentResult

 public ContentResult GetResultString(int gClassID, int methodID)
        {
           string result = NetHelper.Get(url);
            return  return Content(result , "application/json");
        }

不知道直接把接口B的流怎么返回

寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 16:07

能得到压缩的返回的流,怎么压入以上action的response呢?

寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 16:44

@寂寞的博客:  HttpContext.Response.BinaryWrite(byte[]..)试试

极致啊 | 园豆:216 (菜鸟二级) | 2017-06-29 18:03

@极致啊: 嗯,解决了

     using (Stream _ResponseStream = _WebResponse.GetResponseStream())
                    {
                        by = StreamToBytes(_ResponseStream);
                    }

                HttpContext.Current.Response.BinaryWrite(by);
           //给action返回“”就可以了
         return string.Empty;
寂寞的博客 | 园豆:57 (初学一级) | 2017-06-30 11:46
其他回答(1)
0

你怎么返回的.

收获园豆:20
吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-29 15:54

通过

 using (StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream()))
                    {
                        _StrResponse = _ResponseStream.ReadToEnd();
                    }

获取返回的字符串,然后就当个普通字符串那样返回的

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 15:59

@寂寞的博客: 到远处去字符串...你至少要字节流吧.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-29 16:01

@吴瑞祥: 

 public static string Get(string url, string sendHeader, string method = "get")
        {
            string _StrResponse = "";
            try
            {
                HttpWebRequest _WebRequest = (HttpWebRequest)WebRequest.Create(url);

                _WebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36";
                _WebRequest.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
                _WebRequest.Accept = "application/json, */*; q=0.01";
                
                _WebRequest.KeepAlive = false;
                _WebRequest.ContentType = "application/json";
                _WebRequest.Headers.Add("X-Signature-Code", sendHeader);
                _WebRequest.Headers.Add("Accept-Encoding", "gzip,deflate");
WebRequest.AutomaticDecompression = DecompressionMethods.Deflate;
                _WebRequest.Method = method;
                _WebRequest.Date = DateTime.Now;

                using (HttpWebResponse _WebResponse = (HttpWebResponse)_WebRequest.GetResponse())
                {
                    using (StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream()))
                    {
                        _StrResponse = _ResponseStream.ReadToEnd();
                    }
                }
                //ReturnMessage rmsg = Newtonsoft.Json.JsonConvert.DeserializeObject<ReturnMessage>(_StrResponse);
                return _StrResponse;
            }
            catch
            {
               // return new ReturnMessage() { Code = -100, Message = "获取接口数据失败" };
                return _StrResponse;
            }

        }

这就是获取的方法,把接口B的流读成字符串,然后返回

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 16:10

@寂寞的博客: 读出来的字符串是正确的吗?

不是gzip压缩过的.也没看到解压的地方?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-29 16:12

@吴瑞祥: 读出来就是压缩过的,我的意思是接口B既然已经压缩了,我就不用再解压再压缩返回给前端,而直接返回压缩的内容了,但是当我压缩的内容当做普通字符串返回,并给头信息加content-encoding时候就不返回任何东西,不加头信息返回的就是压缩过的内容,然后没有头信息

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 16:15

@寂寞的博客: 一个字符串gzip压缩后的结果是一个二进制数组.

而不是另一个字符串.所以你要读的时候需要对这个二进制数组进行gzip解压.然后才能转成数组.

比如  abc压缩完是 byte[]{1}.你拿到一个1直接读成字符串可能是c.而不是abc.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-29 16:21

@吴瑞祥: 那么只能把压缩的数据解压出来,再同样的方式压缩后发送给调用者了么?

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 16:35

@寂寞的博客: 不用...你直接当成二进制读出来就行了.读出二进制数组.

然后把二进制数组直接放进响应流里放回给前端.再在头上加上gzip让前端自己去解压就可以了.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-29 16:45

@吴瑞祥: 但是mvc那个action需要返回ContentResult,不知道怎么把数组返回去

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-06-29 17:03

@寂寞的博客: 看你心情了.不反回字节数组.那你就解压. 不解压就改返回值.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-29 17:05

@吴瑞祥: 好的,解决了,感谢

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-06-30 11:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册