如何在不从服务器读取内容的情况下获取“ HttpStatusCode”?

时间:2018-06-26 12:28:21

标签: c# .net dotnet-httpclient

我从服务器上检索了巨大的JSON数据
问题是,序列化过程会产生性能成本,为了最大程度地降低此成本,我需要首先以流的形式检索此数据,然后在Newtonsoft的Json.netserialize the data as a stream的帮助下将其恢复为所需的数据。类型。
现在我正在这样做:

using (var stream = await httpClient.GetStreamAsync(requestUrl))
{
    using(var streamReader = new StreamReader(stream))
    {
        using(var jsonReader = new JsonTextReader(streamReader))
        {
            var items = jsonSerializer.Deserialize<TEntity[]>(jsonReader);
            //Some logic
        }
    }
}

上面的代码不错,但是我需要从响应对象中获取HttpStatusCode,但是在处理流时却无法获取响应对象。我搜索了一个解决方案,发现了this个问题。
现在,我的问题是:两种方法之间有什么区别吗?
调用GetAsync获取响应对象,然后调用response.Content.ReadAsStreamAsync会产生性能开销吗?
我的意思是HttpClient是如何做到的?
它会加载数据吗?进入内存,然后当我调用response.Content.ReadAsStreamAsync时,我以流的形式从内存中读取数据?
或者,当我调用response.Content.ReadAsStreamAsync时,我是直接从服务器中以流的形式获取数据吗?

1 个答案:

答案 0 :(得分:2)

HttpCompletionOption.ResponseHeadersRead是你的朋友。

  

该操作应在响应可用并读取标头后立即完成。内容尚未读取。

您可以在HttpClient方法的一些重载中使用它:

    using (HttpResponseMessage response = await client.GetAsync(url, 
                                     HttpCompletionOption.ResponseHeadersRead))
    using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
    {
        //...

HttpCompletionOption控制响应是在完全下载后(ResponseContentRead)还是在接收到标头后立即返回给调用者(ResponseHeadersRead),这允许流式传输和节省内存资源。