代码之家  ›  专栏  ›  技术社区  ›  Rickless

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

  •  -1
  • Rickless  · 技术社区  · 6 年前

    我找回了一个巨大的 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响应 我直接从服务器获取数据流?

    1 回复  |  直到 6 年前
        1
  •  2
  •   spender    6 年前

    HttpCompletionOption.ResponseHeadersRead 是你的朋友。

    一旦响应可用并且读取了头,操作就应该完成。内容尚未读取。

    您可以在httpclient方法的某些重载中使用它:

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

    HttpCompletionOption 控制是否在响应完全下载后将其返回给调用方( ResponseContentRead )或者在收到邮件头之后( ResponseHeadersRead ,它允许流式传输和保存内存资源。