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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:42