如何解决ASP.NET Core Web API中的HTTP错误与网络错误
API网络与HTTP错误排查及解决步骤
我用VS 2022构建了一个用于获取信息的API,目前已投入客户端使用,相关控制器类及动作方法代码如下:
[Route("[controller]")] [ApiController] public class ABCController : ControllerBase { [HttpPost("[action]")] [ProducesResponseType(typeof(Unit), 200)] public async Task<object[]> MoreDetails(SearchInfo sc) { Error error = new Error(1, ""); Unit[] units = null; bool authavail = true; try { if (CheckPassword()) { MoreDetailsInfo lobjSearch = new MoreDetailsInfo (this._iconfiguration); if (this._iconfiguration["trackid"] == "1") { authavail = lobjSearch.Ischeck(sc); } if (authavail) { units = lobjSearch.GetInfo(sc); if (units != null && units.Length == 1) { if (units[0].IsGatewayError) { Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorNumber = -3; arrError[0].ErrorMessage = "Error in response"; return arrError; } } else if (units == null) { Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorMessage = "unable to take availabilities"; return arrError; } } else { Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorMessage = "Invalid destination!"; return arrError; } } else { Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorNumber = -3; arrError[0].ErrorMessage = "Authentication failed..."; return arrError; } } catch (Exception ex) { } return units; } }
但客户端反馈使用过程中遇到网络错误与HTTP错误,以下是具体排查和解决步骤:
一、基础环境与状态排查
- 先获取客户端收到的具体HTTP状态码(如400/401/500/502等):
- 400系列:聚焦客户端请求问题(参数格式错误、权限不足、请求头缺失)
- 500系列:重点排查服务端内部逻辑或依赖故障
- 验证API服务可用性:用Postman/Swagger直接调用接口,确认服务是否可达、响应是否正常
- 排查网络链路:确认客户端与API服务器之间的防火墙、代理、DNS解析无异常,可通过ping、telnet测试连通性
- 启用并查看服务端日志:开启ASP.NET Core内置日志或第三方日志组件(如Serilog),记录请求入参、执行流程、异常详情,定位请求是否到达服务端、在哪一步出错
二、代码层面问题排查与修复
从当前代码来看,存在多个可能引发错误的点,逐一处理:
1. 修复空异常捕获
当前catch块完全吞掉异常,无法定位内部错误,必须补充日志记录和错误响应:
catch (Exception ex) { // 记录异常详情到日志系统 _logger.LogError(ex, "MoreDetails接口执行异常,请求参数:{SearchInfo}", sc); // 返回明确的服务器错误响应 Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorNumber = -999; arrError[0].ErrorMessage = "服务器内部错误,请稍后重试"; return arrError; }
2. 统一响应类型与标注
方法返回object[]但ProducesResponseType标注的是Unit,会导致文档混乱和客户端解析错误:
- 定义通用响应模型:
public class ApiResponse<T> { public bool IsSuccess { get; set; } public T Data { get; set; } public Error ErrorInfo { get; set; } }
- 修改方法返回
Task<ApiResponse<Unit[]>>,同步更新ProducesResponseType标注,让客户端能清晰区分成功/失败响应
3. 避免空返回风险
当units为null且未进入错误分支时,会返回null,引发客户端解析异常:
在方法末尾添加兜底判断:
if (units == null) { Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorMessage = "未获取到有效数据"; return arrError; } return units;
4. 规范认证错误的HTTP状态码
认证失败时应返回标准的401 Unauthorized状态码,而非仅返回错误数组:
else { Response.StatusCode = StatusCodes.Status401Unauthorized; Error[] arrError = new Error[1]; arrError[0] = new Error(); arrError[0].ErrorNumber = -3; arrError[0].ErrorMessage = "Authentication failed..."; return arrError; }
5. 排查第三方依赖故障
代码中lobjSearch.GetInfo(sc)依赖外部服务(数据库/第三方API),需:
- 检查
MoreDetailsInfo类中Ischeck和GetInfo方法的异常处理逻辑 - 验证第三方服务的可用性、超时设置,确认是否存在服务不可用或响应超时情况
三、验证与监控
- 用Postman模拟各种场景(认证失败、参数错误、无数据、第三方服务异常),验证响应是否符合预期
- 让客户端测试修改后的API,确认错误是否消失
- 持续监控API日志,及时捕获新的异常或请求异常
内容的提问来源于stack exchange,提问作者wiki
相关产品推荐
相关产品推荐

