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

.NET多文件上传耗时排查:UI Controller中转请求过慢

问题

我是.NET环境新手,当前实现的流程为:UI通过JS Ajax请求发送至ASP.NET UI Controller,再由该Controller调用其他API完成多文件上传。单文件上传正常,但上传多个3MB左右的文件时耗时极长。直接通过JS调用目标API上传速度很快,但经UI Controller中转则速度骤降。我已添加日志但未发现代码内耗时点,Chrome网络标签页显示请求处于等待状态,以下是UI Controller代码:

public async Task<JsonResult> DataList()
{
    var client = GetHttpClientWithBearerToken();
    client.Timeout = TimeSpan.FromSeconds(300);
    var url = "some url";
    string Rec;
    string File;
    try
    {

        var requestContent = new MultipartFormDataContent();
        requestContent.Add(new StringContent(HttpContext.Request.Form["Id"]), "Id");


        int FilesCount = HttpContext.Request.Files.Count;            
        for (int i = 0; i < FilesCount; i++)
        {
            HttpPostedFileBase file = HttpContext.Request.Files[i];
            requestContent.Add(new StreamContent(file.InputStream), "file[]", file.FileName);
        }

        HttpResponseMessage responseMessage = await client.PostAsync(url, requestContent);

        if (responseMessage.IsSuccessStatusCode)
        {
            var returnData = responseMessage.Content.ReadAsStringAsync().Result;

            var jsonResult = Json(new { success = true, Content = returnData }, JsonRequestBehavior.AllowGet);

            return jsonResult;
        }
        else
        {
            return Json(new { success = false, Content = "-1" }, JsonRequestBehavior.AllowGet);
        }
    }
    catch (Exception e)
    {
        Logging.WriteLog(e.Message, Logging.LogMsgType.General);
    }
    return Json(new { success = false, Content = "-1" }, JsonRequestBehavior.AllowGet);
}

现需排查IIS及请求链路中耗时过长的原因。

排查方向与优化建议

代码层面优化与排查

  • 修复同步阻塞问题:代码中responseMessage.Content.ReadAsStringAsync().Result使用同步等待,会阻塞线程池线程,在多文件上传场景下拖慢处理速度,替换为异步等待:
    var returnData = await responseMessage.Content.ReadAsStringAsync();
    
  • 复用HttpClient实例:每次请求创建新HttpClient会导致套接字资源泄漏和连接建立开销,建议改为单例模式或使用IHttpClientFactory管理实例,避免重复创建销毁连接。
  • 提升流处理效率:直接使用file.InputStream缺少缓冲,可包装BufferedStream优化读取性能:
    requestContent.Add(new StreamContent(new BufferedStream(file.InputStream)), "file[]", file.FileName);
    

IIS配置检查

  • 请求限制配置:进入IIS的请求筛选,确认最大允许内容长度是否足够(多个3MB文件总和需留有余量),同时检查站点的连接超时和超时时间设置,避免请求中途超时等待。
  • 应用程序池参数:查看应用程序池的队列长度、最大工作进程数,若队列已满或工作进程不足,会导致请求排队等待;另外检查回收设置,确保上传过程中不会触发应用池回收。
  • 压缩策略调整:若IIS开启了请求压缩,Multipart类型的上传请求可能因压缩消耗额外CPU,可在web.config中配置排除该类型请求的压缩:
    <system.webServer>
      <urlCompression doStaticCompression="true" doDynamicCompression="true">
        <dynamicTypes>
          <add mimeType="multipart/form-data" enabled="false" />
        </dynamicTypes>
      </urlCompression>
    </system.webServer>
    

请求链路排查

  • 网络连通性测试:用ping、tracert工具测试UI服务器到目标API服务器的网络延迟和丢包情况,确认是否存在带宽瓶颈或路由问题。
  • 目标API负载检查:查看目标API的日志,对比直接调用和中转请求的处理耗时,确认是否中转请求触发了目标API的限流或资源竞争。
  • ASP.NET管道跟踪:启用ASP.NET请求跟踪日志,查看请求在认证、授权、模块处理等管道阶段的耗时,定位是否有额外的中间件导致延迟。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:39:34