Azure Web App中.NET Core 3.1 MVC请求间歇性失败求助
解决Azure Web App中0x800704CD网络连接异常问题
问题概述
在Azure Web App部署的.NET Core 3.1 MVC应用中,处理约1MB大小的请求时出现间歇性失败:前两次请求报错,第三次成功;本地运行无此问题。报错核心信息:
The client has disconnected <--- An operation was attempted on a nonexistent network connection. (0x800704CD)
完整异常栈:
[Error] Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: An unhandled exception has occurred while executing the request.Microsoft.AspNetCore.Connections.ConnectionResetException: The client has disconnected---> System.Runtime.InteropServices.COMException (0x800704CD): An operation was attempted on a nonexistent network connection. (0x800704CD)---> End of inner exception stack trace ---at Microsoft.AspNetCore.Server.IIS.Core.IO.AsyncIOOperation.GetResult(Int16 token)at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.ReadBody()at System.IO.Pipelines.PipeCompletion.ThrowLatchedException()at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result)at System.IO.Pipelines.Pipe.GetReadAsyncResult()at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.ReadAsync(Memory`1 memory, CancellationToken cancellationToken)at Microsoft.AspNetCore.Server.IIS.Core.HttpRequestStream.ReadAsyncInternal(Memory`1 buffer, CancellationToken cancellationToken)at System.IO.Pipelines.StreamPipeReader.ReadAsync(CancellationToken cancellationToken)at Microsoft.AspNetCore.WebUtilities.FormPipeReader.ReadFormAsync(CancellationToken cancellationToken)at Microsoft.AspNetCore.Http.Features.FormFeature.InnerReadFormAsync(CancellationToken cancellationToken) at Microsoft.AspNetCore.Mvc.ModelBinding.FormValueProviderFactory.AddValueProviderAsync(ValueProviderFactoryContext context)at Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync(ActionContext actionContext, IList`1 factories)at Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.TryCreateAsync(ActionContext actionContext, IList`1 factories)at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<g__Bind|0>d.MoveNext()--- End of stack trace from previous location where exception was thrown ---at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
环境信息
- .NET框架:.NET Core 3.1
- 应用类型:MVC Core App
- Azure Web App配置:.NET 6 LTS
- 其他配置:64位、集成管道、HTTP 1.1、WebSocket关闭、TLS 1.2
已尝试操作
- 设置
SCM_COMMAND_IDLE_TIMEOUT=600 - 监控显示内存、CPU无峰值,处于正常范围
解决方案
1. 调整Azure Web App请求超时与缓冲区配置
在Azure门户的Web App配置中,添加以下应用设置:
ASP.NET_CORE_REQUEST_TIMEOUT: 设置为00:10:00(可根据实际处理耗时调整,10分钟足够覆盖1MB请求的处理)WEBSITE_MAX_REQUEST_BUFFER: 设置为10485760(10MB,扩大默认缓冲区限制,适配1MB请求的传输需求)
2. 修正.NET版本不匹配问题
当前应用基于.NET Core 3.1开发,但Azure Web App配置为.NET 6 LTS,版本不一致可能引发IIS托管层的兼容性问题:
- 方案一:将Azure Web App的.NET运行时版本切换为
.NET Core 3.1 - 方案二:升级应用代码至.NET 6 LTS,适配Azure配置的运行时环境
3. 启用HTTP/2优化连接稳定性
当前使用HTTP 1.1,切换到HTTP/2可提升连接可靠性:
- 在Azure Web App配置中,将
HTTP version改为2.0
4. 添加异常捕获与重试逻辑
在MVC控制器中针对表单读取或模型绑定环节捕获连接重置异常,添加自动重试逻辑:
[HttpPost] public async Task<IActionResult> YourAction() { int retryCount = 2; while(retryCount >= 0) { try { var form = await Request.ReadFormAsync(); // 业务逻辑处理 return Ok(); } catch(ConnectionResetException) { retryCount--; if(retryCount < 0) throw; await Task.Delay(100); } } return BadRequest(); }
5. 检查Web App实例状态与资源配置
- 若为多实例部署,检查实例健康状态,尝试重启Web App实例
- 确认App Service Plan的资源配额充足,避免因资源节流导致连接中断
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

