Azure部署ASP.NET Core 8 Web API接收AXIS相机图片异常求助
AXIS相机4G上传图片到Azure Web API频繁断开连接问题
环境配置
- .NET 8
- EF Core 8
- C# 12
问题描述
开发了一个Web API用于接收路边AXIS相机通过4G网络上传的图片,本地VS2022运行时所有图片都能成功接收并保存到Blob存储,但部署到Azure后仅能接收少量图片。通过Application Insights发现大量以下异常:
System.OperationCanceledException相关调用栈Microsoft.AspNetCore.Connections.ConnectionResetException(消息:The client has disconnected An operation was attempted on a nonexistent network connection. (0x800704CD))
API控制器代码
[HttpPost] [ApiKey] public async Task<IActionResult> AddPassage(CancellationToken cancellationToken) { Stream requestBody = new MemoryStream(); await Request.Body.CopyToAsync(requestBody, cancellationToken); var queryString = Guard.Against.NullOrEmpty(Request.QueryString.Value); var header = Guard.Against.NullOrEmpty(Request.Headers.ContentDisposition.ToString()); var command = new CreatePassageCommand(requestBody, queryString, header); var result = await _sender.Send(command, cancellationToken); if (result.IsFailure) { return BadRequest(result.Error); } return Ok(); }
可能的解决方案
1. 调整请求超时设置
Azure App Service默认请求超时较短(默认230秒),4G网络不稳定容易触发超时中断。可以从两方面调整:
- 在
appsettings.json中配置Kestrel的超时参数:"Kestrel": { "Limits": { "KeepAliveTimeout": "00:10:00", "RequestHeadersTimeout": "00:10:00" } } - 登录Azure门户,在App Service的常规设置中,将请求超时调整为更大的值(比如10分钟)。
2. 改用流式上传减少内存占用
当前代码将整个请求体复制到MemoryStream,大文件+网络波动会增加连接中断概率。建议直接将请求流写入Blob存储,跳过内存缓存步骤:
[HttpPost] [ApiKey] public async Task<IActionResult> AddPassage(CancellationToken cancellationToken) { var queryString = Guard.Against.NullOrEmpty(Request.QueryString.Value); var header = Guard.Against.NullOrEmpty(Request.Headers.ContentDisposition.ToString()); // 直接流式写入Blob,避免内存缓存 await _blobService.UploadStreamAsync( Request.Body, "your-blob-container", GenerateBlobFileName(queryString), cancellationToken ); // 单独处理数据库记录创建 var result = await _sender.Send( new CreatePassageCommand(queryString, header), cancellationToken ); if (result.IsFailure) { return BadRequest(result.Error); } return Ok(); }
3. 添加异常重试机制
针对4G网络的不稳定性,在API端捕获连接类异常,返回可重试的状态码,同时建议在相机端配置上传重试逻辑:
- 实现全局异常过滤器捕获特定异常:
public class ConnectionExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { if (context.Exception is ConnectionResetException || context.Exception is OperationCanceledException) { context.Result = new StatusCodeResult(StatusCodes.Status503ServiceUnavailable); context.ExceptionHandled = true; } } } - 在
Program.cs中注册过滤器:builder.Services.AddControllers(options => { options.Filters.Add<ConnectionExceptionFilter>(); });
4. 检查Azure网络配置
- 确认App Service的出站网络规则未限制AXIS相机的动态4G IP段,避免防火墙拦截请求。
- 如果使用了Azure Front Door或API Management,检查中间层的超时设置和连接限制,防止中间服务提前断开连接。
内容的提问来源于stack exchange,提问作者SBarkovskis
相关产品推荐
相关产品推荐

