MVC应用调用API时如何检测API运行状态并处理无法连接异常
API不可连场景的异常处理方案
你之前的实现不生效主要有两个核心问题:
- 手动实例化的
HttpException对象和实际API请求的响应、异常完全没有关联,无法获取API侧的状态 - 当API未运行、网络不通时,
PostAsync方法会直接抛出异常,根本不会走到后续状态码判断的逻辑,没有异常捕获机制自然无法处理这类场景
完整实现思路
需要同时覆盖两类异常场景:
- 无响应类异常:API未启动、网络不通、连接被拒绝、请求超时等无法得到API响应的场景,用
try-catch捕获 - 响应错误类场景:API正常响应,但返回4xx/5xx错误状态码的场景,直接读取
HttpResponseMessage的StatusCode属性判断
修改后的代码示例
// 注意:生产环境建议用IHttpClientFactory注入HttpClient,避免手动实例化导致的端口耗尽、DNS更新不生效问题 HttpClient client = new HttpClient(); client.BaseAddress = new Uri("https://localhost:44304"); // 设置请求超时时间,避免长时间无响应挂起 client.Timeout = TimeSpan.FromSeconds(10); HttpContent content = new FormUrlEncodedContent( new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("username", lgv.username), new KeyValuePair<string,string>("password", lgv.password), new KeyValuePair<string,string>("grant_type","password"), }); content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); content.Headers.ContentType.CharSet = "UTF-8"; HttpResponseMessage resultDisplay = null; try { resultDisplay = await client.PostAsync("token", content); } catch (HttpRequestException) { // 捕获API未启动、连接被拒绝、网络不通等异常,跳转至API不可用页面 return View("ApiUnavailable"); } catch (TaskCanceledException) { // 捕获请求超时异常,跳转至超时提示页 return View("RequestTimeout"); } if (resultDisplay.IsSuccessStatusCode) { var loginData = await resultDisplay.Content.ReadAsAsync<LoginResponseViewModel>(); Session["access_token"] = loginData.Access_Token; return View("Success"); } // 处理API返回的错误状态码 int statusCode = (int)resultDisplay.StatusCode; ViewBag.ErrorCode = statusCode; switch (statusCode) { case 400: ViewBag.ErrorMsg = "请求参数错误,请检查账号密码格式"; break; case 401: ViewBag.ErrorMsg = "账号或密码错误,请重试"; break; case 500: ViewBag.ErrorMsg = "API服务内部错误,请稍后再试"; break; default: ViewBag.ErrorMsg = $"请求出错,错误码:{statusCode}"; break; } return View("Error");
补充说明
你可以根据业务需要调整不同状态对应的跳转页面,也可以在捕获异常时添加日志记录,方便后续排查问题。
内容的提问来源于stack exchange,提问作者user14979715
相关产品推荐
相关产品推荐

