开发与生产环境均出现Client has disconnected错误求助
解决Angular + .NET Core 6.0应用"Client has disconnected"错误的思路
我们的应用采用Angular前端、.NET Core 6.0后端,在开发、生产及调试环境均出现Client has disconnected错误,排查多日无果,调整服务器配置无效,报错堆栈信息如下:
Microsoft.AspNetCore.Connections.ConnectionResetException HResult=0x80131620 Message=The client has disconnected Source=Microsoft.AspNetCore.Server.IIS StackTrace: at Microsoft.AspNetCore.Server.IIS.Core.IO.AsyncIOOperation.GetResult(Int16 token) at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.<ReadBody>d__385.MoveNext() at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result) at System.IO.Pipelines.Pipe.ReadAsync(CancellationToken token) at System.IO.Pipelines.Pipe.DefaultPipeReader.ReadAsync(CancellationToken cancellationToken) at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.<ReadAsync>d__381.MoveNext() at System.Runtime.CompilerServices.ValueTaskAwaiter1.GetResult() at Microsoft.AspNetCore.Server.IIS.Core.HttpRequestStream.<ReadAsyncInternal>d__10.MoveNext() at System.Runtime.CompilerServices.ValueTaskAwaiter1.GetResult() at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.<ReadAsync>d__40.MoveNext() at System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult() at Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions.<DrainAsync>d__3.MoveNext() at Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter.<ReadRequestBodyAsync>d__12.MoveNext() at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.<BindModelAsync>d__11.MoveNext() at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.<BindModelAsync>d__8.MoveNext() at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext() at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<<InvokeInnerFilterAsync>g__Awaited|13_0>d.MoveNext() at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<<InvokeFilterPipelineAsync>g__Awaited|20_0>d.MoveNext() at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<<InvokeAsync>g__Logged|17_1>d.MoveNext() at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<<InvokeAsync>g__Logged|17_1>d.MoveNext() at Microsoft.AspNetCore.Routing.EndpointMiddleware.<<Invoke>g__AwaitRequestTask|6_0>d.MoveNext() at Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.<HandleAsync>d__0.MoveNext() at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.<Invoke>d__6.MoveNext() at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.<Invoke>d__6.MoveNext() at Camms.Risk.Webapi.Middlewares.ExceptionMiddleware.<InvokeAsync>d__4.MoveNext() in C:\Projects\Git\Camms.Risk\Camms.Risk\Camms.Risk.Webapi\Middlewares\ExceptionMiddleware.cs:line 34 Inner Exception 1: COMException: An operation was attempted on a nonexistent network connection. (0x800704CD)
排查解决思路
前端请求生命周期检查
- 确认Angular端是否存在请求发送后主动中断的情况:比如路由跳转、组件销毁时未取消HTTP请求,导致后端还在处理时前端断开连接。用RxJS的
takeUntil操作符绑定组件生命周期,确保组件销毁时自动取消未完成的请求。 - 检查大文件传输场景:如果有上传/大请求体操作,前端可能因超时或网络波动主动断开。调整Angular的HTTP请求超时配置,后端同步修改
Program.cs中Kestrel的最大请求体限制和超时时间:builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxRequestBodySize = 104857600; // 100MB options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5); });
- 确认Angular端是否存在请求发送后主动中断的情况:比如路由跳转、组件销毁时未取消HTTP请求,导致后端还在处理时前端断开连接。用RxJS的
后端异常处理与配置优化
- 检查自定义异常中间件:从堆栈看错误触发在
ExceptionMiddleware第34行,在中间件中捕获ConnectionResetException,判断为客户端主动断开后直接终止处理,避免错误日志泛滥:public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (ConnectionResetException) { // 客户端已断开,无需处理,直接返回 context.Response.StatusCode = StatusCodes.Status499ClientClosedRequest; } catch (Exception ex) { // 其他异常处理逻辑 } } - 调整IIS应用程序池配置:延长
Idle Time-out时间,增大Ping Maximum Response Time,避免应用池提前回收导致连接断开。
- 检查自定义异常中间件:从堆栈看错误触发在
网络层排查
- 检查防火墙/代理服务器:确认是否存在防火墙、反向代理(如Nginx、IIS ARR)在请求未完成时主动断开连接,调整代理的超时时间和连接保持设置。
- 查看系统日志:Windows服务器查看事件查看器的系统日志,排查是否有TCP连接异常断开的系统级错误;开发环境用Wireshark抓包,分析网络连接状态。
.NET Core版本与配置调整
- 禁用不必要的请求体缓冲:如果业务不需要缓冲请求体,在控制器方法添加
[DisableRequestSizeLimit]特性,或全局配置:builder.Services.Configure<FormOptions>(options => { options.BufferBody = false; }); - 升级.NET Core补丁:当前使用的.NET Core 6.0如果是旧版本,升级到最新的补丁版本,修复官方已知的连接处理Bug。
- 禁用不必要的请求体缓冲:如果业务不需要缓冲请求体,在控制器方法添加
内容的提问来源于stack exchange,提问作者Hashan S.
相关产品推荐
相关产品推荐

