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

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发现大量以下异常:

  1. System.OperationCanceledException 相关调用栈
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:27:19