HttpClient GetStreamAsync和HTTP状态代码?

Ale*_*ith 13 c# stream httpclient json.net

我希望按照json.net性能提示文档的建议使用流,但是我无法找到如何获取http状态代码而没有典型的等待HttpResponse.

是否有一种方法可以在不读取数据的情况下首先获取状态代码?所以仍然利用流?

Ale*_*ith 19

我没有测试过以确保它的性能,但这看起来很有希望:

using(HttpClient client = new HttpClient())
{
    var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead);

    response.EnsureSuccessStatusCode();

    using (var stream = await response.Content.ReadAsStreamAsync())
    using (var streamReader = new StreamReader(stream))
    using (var jsonReader = new JsonTextReader(streamReader))
    {
      var serializer = new JsonSerializer();

       //do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`HttpCompletionOption`绝对是实现您所追求的目标的方式。 (3认同)

rob*_*pim 5

我更喜欢通过 HttpResponseMessage 来处理using它,因为它是一次性的。我也更喜欢不依赖异常处理来处理失败的请求。相反,我更喜欢检查IsSuccessStatusCode布尔值并相应地进行。例如:

using(HttpClient client = new HttpClient())
{
    using(var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead))
    {
        if(response.IsSuccessStatusCode)
        {
            using (var stream = await response.Content.ReadAsStreamAsync())
            using (var streamReader = new StreamReader(stream))
            using (var jsonReader = new JsonTextReader(streamReader))
            {
              var serializer = new JsonSerializer();

               //do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
            }
        }
        else {
            //do your error logging and/or retry logic
        }
    }       
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您使用速率受限的api 发送 HEAD 请求有时是不可行的。因此,这里有一个使用良好 ol' 方式的代码示例HttpWebRequest(请注意,没有比WebException这种情况更好的处理 http 错误的方法了):

var req = WebRequest.CreateHttp("http://httpbin.org/get");

/*
 * execute
 */
try
{
    using (var resp = await req.GetResponseAsync())
    {
        using (var s = resp.GetResponseStream())
        using (var sr = new StreamReader(s))
        using (var j = new JsonTextReader(sr))
        {
            var serializer = new JsonSerializer();
            //do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
        }
    }
}
catch (WebException ex)
{
    using (HttpWebResponse response = (HttpWebResponse)ex.Response)
    {
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            string respStr = sr.ReadToEnd();
            int statusCode = (int)response.StatusCode;

            //do your status code logic here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)