using HttpClientStudy.Config; using Microsoft.Extensions.Options; namespace HttpClientStudy.Core { /// <summary> /// Http 错误处理 /// <list type="number"> /// <listheader> /// <term>常见方式</term> /// <description>(仅个人见解)</description> /// </listheader> /// <item> /// <term>HtppClient 提供的状态码、EnsureSuccessStatusCode()等机制</term> /// <description>(适用HttpClient内部错误)</description> /// </item> /// <item> /// <term>Try Catch 方式</term> /// <description>(适用外部)</description> /// </item> /// <item> /// <term>HttpClient 管道</term> /// <description>(统一处理)</description> /// </item> /// <item> /// <term>使用 Polly 类库</term> /// <description>(更多功能,也可结合HttpClient管道)</description> /// </item> /// </list> /// </summary> /// <remarks> /// 错误处理 /// </remarks> public class HttpError { // 定义一个 HttpClient 共享实例 public static HttpClient HttpClient = new HttpClient(new SocketsHttpHandler() { PooledConnectionLifetime = TimeSpan.FromMinutes(1) }) { BaseAddress = new Uri(WebApiConfigManager.GetWebApiConfig().BaseUrl) }; /// <summary> /// 未知主机错误 /// </summary> /// <returns></returns> public async Task<HttpStatusCode> UnknownHostAsync() { var response = await HttpClient.GetAsync("http://www.unknowhost_nonono.com/404.html"); return response.StatusCode; } /// <summary> /// 没有服务(WebApi服务未启动) /// </summary> /// <returns></returns> public async Task<HttpStatusCode> NoServiceAsync() { try { var response = await HttpClient.GetAsync("http://localhost:30"); } catch (Exception ex) { // 捕获异常,处理 await Console.Out.WriteLineAsync(ex.Message ); throw; } return HttpStatusCode.OK; } /// <summary> /// 404错误 /// </summary> /// <returns></returns> public async Task<HttpStatusCode> Http404Async() { var response = await HttpClient.GetAsync("/404.html"); return response.StatusCode; } /// <summary> /// 服务器错误 /// </summary> /// <returns></returns> public async Task<HttpStatusCode> Http500Async() { var response = await HttpClient.GetAsync("/api/ErrorDemo/Error500"); return response.StatusCode; } } }