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

处理HTTP POST请求时出现ConnectionResetException的问题求助

问题排查与解决方案

核心问题定位

从日志和调用栈可以明确:异常发生在自定义ErrorHandlingMiddleware的ReadRequestBody方法中,当后端尝试读取请求体时,前端客户端已经断开连接,导致ConnectionResetException。该异常未被中间件正确捕获处理,最终冒泡为未处理异常并返回500状态码。

前端代码优化

你的Axios请求中手动用JSON.stringify处理请求体是多余的——Axios会自动将JavaScript对象序列化为JSON,并自动设置正确的Content-Type头。手动序列化可能引发潜在格式问题,建议修改:

const URL = API_LINK + `/task-types`

await axios({
    method: 'POST',
    url: URL,
    headers: {
        Accept: 'application/json',
        Authorization: `Bearer ${this.token}`,
    },
    // 直接传对象,无需手动JSON.stringify
    data: {
        name: task.name,
        description: task.description,
        deactivated: task.deactivated,
    },
})
.then(res => console.log(res))
.catch(err => console.log(err))

后端中间件修复(关键)

问题核心是自定义异常处理中间件在读取请求体时未捕获ConnectionResetException。需修改ReadRequestBody方法,添加异常捕获逻辑:

private async Task<string> ReadRequestBody(HttpRequest request)
{
    try
    {
        using var reader = new StreamReader(request.Body);
        return await reader.ReadToEndAsync();
    }
    // 捕获客户端断开连接的异常
    catch (ConnectionResetException)
    {
        return string.Empty;
    }
    // 捕获对应日志中的COM异常(错误码0x800704CD)
    catch (System.Runtime.InteropServices.COMException ex) when (ex.ErrorCode == -2147023628)
    {
        return string.Empty;
    }
}

同时在中间件的InvokeAsync方法中,处理请求体读取失败的情况,避免异常扩散:

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
    string requestBody = string.Empty;
    try
    {
        // 启用请求体缓冲,避免读取后后续中间件无法复用
        context.Request.EnableBuffering();
        requestBody = await ReadRequestBody(context.Request);
        // 重置流位置
        context.Request.Body.Position = 0;
    }
    catch (Exception ex)
    {
        _logger.LogWarning(ex, "读取请求体失败");
    }

    try
    {
        await next(context);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "请求处理发生异常");
        await HandleExceptionAsync(context, ex);
    }
}

额外排查点

  • 检查前端是否在请求发送后意外关闭页面/组件(如路由跳转、组件卸载),导致连接提前断开
  • 确认后端已启用请求体缓冲(context.Request.EnableBuffering()),否则请求体只能被读取一次
  • 检查IIS/Kestrel的连接超时设置,是否因超时时间过短导致连接被提前终止

内容的提问来源于stack exchange,提问作者ape

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:43:17