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

ASP.NET Core非侵入式Ajax大文件上传未完成问题求助

解决ASP.NET Core非侵入式Ajax大文件上传失败问题

当前使用ASP.NET Core非侵入式Ajax实现文件上传,小文件上传正常,但580MB大文件上传时,在IIS Express和VS2022中长时间等待后无法完成,断点调试发现仅上传部分内容。以下是针对性的解决步骤:

1. 完善ASP.NET Core服务器与表单限制配置

Kestrel服务器默认存在请求大小上限(约30MB),会直接截断大文件请求,需同时配置Kestrel和表单选项:

在Program.cs中添加Kestrel配置,并补充表单头部长度限制:

// 配置Kestrel服务器请求大小
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 629145600; // 设置为600MB,或用int.MaxValue
});

// 配置表单选项
builder.Services.Configure<FormOptions>(options =>
{    
    options.MultipartBodyLengthLimit = 629145600;
    options.ValueLengthLimit = 629145600;
    options.MultipartHeadersLengthLimit = int.MaxValue; // 避免请求头过长被拦截
});

2. 修正Action方法配置与文件读取逻辑

确保Action特性覆盖所有限制,同时采用流式处理大文件,避免一次性加载到内存导致溢出:

[RequestSizeLimit(629145600)]
[RequestFormLimits(ValueLengthLimit = 629145600, MultipartBodyLengthLimit = 629145600, MultipartHeadersLengthLimit = int.MaxValue)]
[HttpPost]
[DisableFormValueModelBinding]        
public async Task<PartialViewResult> Upload()
{
    var formFile = Request.Form.Files["battlePlans"];
    if (formFile != null && formFile.Length > 0)
    {
        // 流式写入文件,避免内存占用过高
        var savePath = Path.Combine(Directory.GetCurrentDirectory(), "Uploads", formFile.FileName);
        using (var stream = new FileStream(savePath, FileMode.Create))
        {
            await formFile.CopyToAsync(stream);
        }
        ViewBag.Success = true;
        ViewBag.Message = "文件上传成功";
    }
    else
    {
        ViewBag.Success = false;
        ViewBag.Message = "未选择有效文件";
    }
    return PartialView("IndexPartials/Upload");
}

注:[MultipartFormData]并非ASP.NET Core内置特性,若为自定义特性需确认逻辑无异常,否则可移除。

3. 调整前端Ajax配置

jQuery原生$.ajax无maxChunkSize参数,当前配置无效。需覆盖非侵入式Ajax的默认超时,并可添加上传进度监听:

@section Scripts {    
    <script>
        $(document).ready(function () {
            // 全局配置Ajax超时与XHR对象
            $.ajaxSetup({
                timeout: 2 * 60 * 60 * 1000, // 2小时超时
                xhr: function () {
                    var xhr = new window.XMLHttpRequest();
                    // 可选:监听上传进度
                    xhr.upload.addEventListener("progress", function (evt) {
                        if (evt.lengthComputable) {
                            var progress = Math.round((evt.loaded / evt.total) * 100);
                            console.log(`上传进度:${progress}%`);
                        }
                    }, false);
                    return xhr;
                }
            });
        });

        // 实现失败回调函数
        function failed(xhr, status, error) {
            $("#frmMessage").text(`上传失败:${error}`).addClass("alert-danger");
        }
    </script>
}

若需更可靠的大文件上传,建议手动实现分片上传逻辑:将文件分割为1MB左右的小块,逐个上传至后端,最后合并文件。

4. 修改IIS Express配置(开发环境)

IIS Express默认限制请求大小,需修改其配置文件:

  1. 找到项目根目录下的隐藏文件夹.vs\config\applicationhost.config
  2. 在<system.webServer>节点下添加请求过滤配置:
<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="629145600" /> <!-- 600MB,单位为字节 -->
    </requestFiltering>
</security>
  1. 重启VS与IIS Express使配置生效。

5. 调试排查要点

  • 查看ASP.NET Core日志或Event Viewer,确认是否有请求被截断的错误信息
  • 在Action中输出Request.ContentLength,验证收到的请求长度与文件实际大小是否一致
  • 检查文件存储目录的磁盘空间与应用程序写入权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:33:34