HttpResponseMessage-从API调用中解压缩Gzip会引发以下异常-响应过早结束

问题描述 投票:2回答:1

我实际上正在使用REST服务,从中我收到以Gzip压缩的响应所以,以下是我的代码

HttpClientHandler handler = new HttpClientHandler()
{
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
var httpClient = new HttpClient(handler);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var result = await httpClient.GetAsync(url);

我得到最后一行“ await httpClient.GetAsync(url)”的异常]

下面是堆栈跟踪:

at System.Net.Http.HttpConnection.<FillAsync>d__87.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.<CopyToAsyncCore>d__10.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)   
at System.IO.Compression.DeflateStream.CopyToStream.<CopyFromSourceToDestinationAsync>d__6.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Net.Http.DecompressionHandler.DecompressedContent.<SerializeToStreamAsync>d__5.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()  
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Net.Http.HttpContent.<LoadIntoBufferAsyncCore>d__54.MoveNext()

作为快速更新:我确实尝试了以下不同的呼叫实现:

HttpWebRequest Http = (HttpWebRequest)WebRequest.Create("url");

Http.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
HttpWebResponse WebResponse = (HttpWebResponse)Http.GetResponse();
Stream responseStream = responseStream = WebResponse.GetResponseStream();
if (WebResponse.ContentEncoding.ToLower().Contains("gzip"))
{
    responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
StreamReader Reader = new StreamReader(responseStream, Encoding.Default);
string responseAsString= Reader.ReadToEnd();
WebResponse.Close();
responseStream.Close();

我在以下行遇到异常字符串responseAsString = Reader.ReadToEnd();

异常消息也是“响应过早结束。”

下面是堆栈跟踪:

at System.Net.Http.HttpConnection.Fill()
at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.Read(Span`1 buffer)
at System.Net.Http.HttpBaseStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Compression.DeflateStream.ReadCore(Span`1 buffer)
at System.IO.Compression.DeflateStream.Read(Byte[] array, Int32 offset, Int32 count)
at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.ReadToEnd()
at ApiCall.Program.<Main>d__0.MoveNext() in 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at ApiCall.Program.<Main>(String[] args)
c# api gzip streamreader gzipstream
1个回答
0
投票

您是否尝试过使用RestSharp进行此请求?它应该为您做好一切。

http://restsharp.org/

© www.soinside.com 2019 - 2024. All rights reserved.