You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:57:02