.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
相关产品推荐
相关产品推荐

