【问题标题】:HttpClient GetStreamAsync and HTTP status codes?HttpClient GetStreamAsync 和 HTTP 状态码?
【发布时间】:2015-07-21 16:48:39
【问题描述】:

我希望使用json.net performance tips documentation 推荐的流,但是如果没有typical awaiting the HttpResponse,我无法找到如何获取 http 状态代码。

有没有办法在不读取数据的情况下先获取状态码?那么还在利用流吗?

【问题讨论】:

    标签: c# stream json.net httpclient


    【解决方案1】:

    我还没有测试以确保它的性能,但这似乎很有希望:

    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
        }
    }
    

    【讨论】:

    • 使用HttpCompletionOption 绝对是实现目标的预期方式。
    【解决方案2】:

    我更喜欢通过using 处理 HttpResponseMessage,因为它是一次性的。我也更喜欢不依赖异常处理来处理失败的请求。相反,我更喜欢检查 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
            }
        }       
    }
    

    编辑:如果您使用 rate limited api 发送 HEAD 请求有时是不可行的。因此,这里有一个代码示例,使用了良好的风格 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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多