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默认限制请求大小,需修改其配置文件:
- 找到项目根目录下的隐藏文件夹
.vs\config\applicationhost.config - 在
<system.webServer>节点下添加请求过滤配置:
<security> <requestFiltering> <requestLimits maxAllowedContentLength="629145600" /> <!-- 600MB,单位为字节 --> </requestFiltering> </security>
- 重启VS与IIS Express使配置生效。
5. 调试排查要点
- 查看ASP.NET Core日志或Event Viewer,确认是否有请求被截断的错误信息
- 在Action中输出
Request.ContentLength,验证收到的请求长度与文件实际大小是否一致 - 检查文件存储目录的磁盘空间与应用程序写入权限
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

