c# - HttpResponseMessage - 从 API 调用解压缩 Gzip 响应会引发以下异常 - 响应提前结束

标签 c# api gzip streamreader gzipstream

我实际上正在使用 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)

最佳答案

尝试将 HttpCompletionOption.ResponseContentRead 添加到 GetAsync 调用中:

var result = await httpClient.GetAsync(url, HttpCompletionOption.ResponseContentRead);

这应该使您的代码等待,直到读取整个响应。

关于c# - HttpResponseMessage - 从 API 调用解压缩 Gzip 响应会引发以下异常 - 响应提前结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59359055/

相关文章:

C# JSON 从 List<> 获取数据

c# - 如何删除 Windows Phone 8.1 应用程序中的动态磁贴标题?

c# - 如何在 ASP.NET Core MVC 2.0 的另一个程序集中使用 Controller ?

javascript - 使用 apache 为 js 应用程序及其 api 提供服务

http - 如何使用 gzip 设置内容编码

asp.net - 为什么 IIS 压缩无法识别我设置的 MIME 类型?

compression - 从单独压缩的 block 创建 gzip 流

c# - 如何加快大型 C# 解决方案的编译

json - PowerShell 调用-WebRequest | API调用

php - 分页的api请求,如何知道是否有另一个页面?