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

ASP.NET Core Web API中stream.CopyToAsync服务器端耗时过长问题排查

ASP.NET Core Web API大文件上传服务器端延迟问题分析

问题描述

我正在使用ASP.NET Core Web API上传10MB文件,已禁用表单绑定,通过multipart获取流。本地环境下文件上传耗时不到1秒,一切正常,但服务器上执行stream.CopyToAsync(memorystream)时至少需要15秒。请问可能是什么原因导致服务器端出现该延迟?

代码示例

[HttpPost, DisableRequestSizeLimit]
[DisableFormValueModelBinding]
public async Task<BaseResponse> Upload()
{
        var response = new BaseResponse();

        if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
        {
            response.StatusCode = "500";
            response.Messages = new System.Collections.Generic.List<string>() { "Bad Request" };
            return response;
        }

        var boundary = MultipartRequestHelper.GetBoundary(
            MediaTypeHeaderValue.Parse(Request.ContentType),
            int.MaxValue);

        var reader = new MultipartReader(boundary, HttpContext.Request.Body);
        var section = await reader.ReadNextSectionAsync();

        while (section != null)
        {
            var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition,
                 out var contentDisposition);

            if (hasContentDispositionHeader && contentDisposition.DispositionType.Equals("form-data") &&
                !string.IsNullOrEmpty(contentDisposition.FileName.Value))
            {
                var fileName = Path.GetRandomFileName();

                using (var memoryStream = new MemoryStream())
                {
                    await section.Body.CopyToAsync(memoryStream);
                    var byteArray = memoryStream.ToArray();
                }

                return response;
            }

            section = await reader.ReadNextSectionAsync();
        }

        return response;
}

可能的原因分析

  • 服务器网络带宽或链路问题:服务器的网络带宽不足,或者客户端到服务器的链路存在拥堵、高延迟,导致请求体数据未完全到达服务器,CopyToAsync在读取流时处于等待状态,表现为耗时过长。
  • 服务器资源瓶颈:服务器CPU、内存使用率过高,大量资源被其他进程抢占,导致异步IO操作无法高效执行,流复制任务被阻塞。
  • ASP.NET Core请求缓冲配置:默认情况下ASP.NET Core会将请求体缓冲到磁盘,如果服务器磁盘IO性能较差(比如使用低速机械硬盘),会导致读取缓冲数据的速度变慢。可以检查是否配置了DisableRequestBuffering,或者调整请求体缓冲的存储位置。
  • Kestrel服务器配置限制:虽然使用了DisableRequestSizeLimit注解,但全局Kestrel配置可能存在未生效的限制,或者线程池配置不足,无法及时处理异步流操作。
  • 前端代理/防火墙影响:服务器前端的负载均衡、Nginx/IIS反向代理或防火墙对上传请求做了限流、校验或缓存处理,导致请求体到达应用服务器的时间被大幅拉长。
  • MemoryStream性能优化缺失:当前代码中MemoryStream未设置初始容量,默认会多次扩容,服务器内存碎片化或分配效率低时,扩容过程会增加耗时。可以预先设置初始容量为文件大小(如new MemoryStream(10 * 1024 * 1024)),减少扩容次数。
  • SSL/TLS加密开销:如果服务器启用HTTPS但未开启硬件加速,或使用了低效的加密算法,加密解密过程会占用大量CPU资源,间接影响流处理速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:42:05