我从服务器上检索了巨大的JSON
数据
问题是,序列化过程会产生性能成本,为了最大程度地降低此成本,我需要首先以流的形式检索此数据,然后在Newtonsoft的Json.net
库serialize 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
时,我是直接从服务器中以流的形式获取数据吗?
答案 0 :(得分:2)
HttpCompletionOption.ResponseHeadersRead
是你的朋友。
该操作应在响应可用并读取标头后立即完成。内容尚未读取。
您可以在HttpClient方法的一些重载中使用它:
using (HttpResponseMessage response = await client.GetAsync(url,
HttpCompletionOption.ResponseHeadersRead))
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
//...
HttpCompletionOption
控制响应是在完全下载后(ResponseContentRead
)还是在接收到标头后立即返回给调用者(ResponseHeadersRead
),这允许流式传输和节省内存资源。