mvc作为接口A,它post请求另一个接口B,获取到的数据是GZIP的,也能获取到头信息的content-encoding,现在问题是怎样把从B获取的压缩数据同样原封不动的发布出去??
我给接口A的response添加了content-encoding 头信息后,提示无任何数据响应,所以请帮助解决如果把请求的gzip数据以同样方式和头信息发布出去?感谢各位
直接用流压。接口A中, 把post接口B得到的stream写入接口A的response中。所谓的接口代理,透传大约就这个意思了
可是这个mvc的action需要返回ContentResult
public ContentResult GetResultString(int gClassID, int methodID) { string result = NetHelper.Get(url); return return Content(result , "application/json"); }
不知道直接把接口B的流怎么返回
能得到压缩的返回的流,怎么压入以上action的response呢?
@寂寞的博客: HttpContext.Response.BinaryWrite(byte[]..)试试
@极致啊: 嗯,解决了
using (Stream _ResponseStream = _WebResponse.GetResponseStream()) { by = StreamToBytes(_ResponseStream); } HttpContext.Current.Response.BinaryWrite(by); //给action返回“”就可以了 return string.Empty;
你怎么返回的.
通过
using (StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream())) { _StrResponse = _ResponseStream.ReadToEnd(); }
获取返回的字符串,然后就当个普通字符串那样返回的
@寂寞的博客: 到远处去字符串...你至少要字节流吧.
@吴瑞祥:
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的流读成字符串,然后返回
@寂寞的博客: 读出来的字符串是正确的吗?
不是gzip压缩过的.也没看到解压的地方?
@吴瑞祥: 读出来就是压缩过的,我的意思是接口B既然已经压缩了,我就不用再解压再压缩返回给前端,而直接返回压缩的内容了,但是当我压缩的内容当做普通字符串返回,并给头信息加content-encoding时候就不返回任何东西,不加头信息返回的就是压缩过的内容,然后没有头信息
@寂寞的博客: 一个字符串gzip压缩后的结果是一个二进制数组.
而不是另一个字符串.所以你要读的时候需要对这个二进制数组进行gzip解压.然后才能转成数组.
比如 abc压缩完是 byte[]{1}.你拿到一个1直接读成字符串可能是c.而不是abc.
@吴瑞祥: 那么只能把压缩的数据解压出来,再同样的方式压缩后发送给调用者了么?
@寂寞的博客: 不用...你直接当成二进制读出来就行了.读出二进制数组.
然后把二进制数组直接放进响应流里放回给前端.再在头上加上gzip让前端自己去解压就可以了.
@吴瑞祥: 但是mvc那个action需要返回ContentResult,不知道怎么把数组返回去
@寂寞的博客: 看你心情了.不反回字节数组.那你就解压. 不解压就改返回值.
@吴瑞祥: 好的,解决了,感谢