区分HttpClient请求失败类型

时间:2013-06-26 16:55:55

标签: c# .net http http-status-codes dotnet-httpclient

我需要编写代码来处理使用.Net Framework 4.5附带的HttpClient对象发出HTTP请求后可能出现的两种不同类型的失败:

  1. 当由于连接问题而无法访问服务器时连接失败 - 例如没有可用连接,超时到期,网络设置不正确等。

  2. 虽然技术上并非失败,但请求成功到达服务器但服务器以HTTP错误状态代码(例如404,400,409,500等)响应的情况

  3. 将一种失效类型视为另一种失效类型非常重要。这是正确可靠的方法吗? EnsureSuccessStatusCode()方法似乎至少有助于第二种情况,但文档令人失望。

1 个答案:

答案 0 :(得分:12)

经过一些手动测试后,好消息是似乎有一种可靠的方法来分离这两种类型的错误,但坏消息是它在所有平台上都不一致 - 至少在Windows Phone 8上没有在.Net Framework 4.5 Full和Windows Store App类型的项目中,以下代码可以解决问题:

        try
        {
            var response = await httpClient.PostAsync(uri, content);

            if (!response.IsSuccessStatusCode)
            {
                // handle the second type of error (404, 400, etc.)
            }
        }
        catch (HttpRequestException ex)
        {
            // handle the first type of error (no connectivity, etc)
        }

不幸的是,在Windows Phone 8上,这两种类型都是在if条件下处理的:IsSuccessStatusCode设置为false而没有HttpRequestException(或任何其他例外)提高。对于WP8,我正在使用HttpClienthttp://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient-for-net-framework-and-windows-phone.aspx)的可移植类库实现,我问他们是否可以修复这种不一致性,希望它可以并且很快就会出现。