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

使用AJAX向.NET 5 MVC控制器上传文件仅偶尔成功问题排查求助

针对重复上传卡住问题的排查方案

这种第一次上传正常、第二次就卡死的情况我之前也踩过坑,大概率和资源没释放、请求复用或者服务器端锁有关,给你列几个针对性的排查点:

1. 别复用FormData实例!

很多人会图方便把FormData写成全局变量,第二次上传直接用同一个对象——但FormData在发送后内部的文件数据会被标记为已读取,第二次再用就会空数据或者触发异常。

解决办法:每次点击上传按钮时,在回调函数里重新创建FormData,比如:

$('#uploadBtn').click(function() {
    // 每次都新建FormData,不要复用
    let formData = new FormData();
    formData.append('file', $('#fileInput')[0].files[0]);
    
    // 后续AJAX请求逻辑
});

2. 检查AJAX请求的状态与重复绑定

先打开浏览器F12的Network标签,看看第二次上传的请求到底发出去没:

  • 如果请求一直处于pending状态,检查AJAX的async配置——要是手动设成false会阻塞线程,保持默认async: true就好。
  • 另外,有没有多次绑定点击事件?比如页面初始化时多次执行绑定代码,导致点一次触发N个请求互相阻塞。可以改成:
// 先解绑再绑定,避免重复绑定
$('#uploadBtn').off('click').on('click', function() {
    // 上传逻辑
});

3. 服务器端的资源锁定排查

既然VS调试时线程卡住,说明Action里大概率有资源没释放:

  • 首先看Action里处理文件流的代码,有没有用using包裹?比如打开文件流后没关闭,导致第二次请求时文件被锁:
// 错误示例:流没释放,会锁文件
var stream = file.OpenReadStream();
// 处理流逻辑...

// 正确做法:using自动释放资源
using (var stream = file.OpenReadStream())
{
    // 处理文件内容
}
  • 可以在Action开头加个日志输出,比如Console.WriteLine($"收到上传请求,文件名:{file.FileName}");,看看第二次请求有没有进入Action。如果进了但卡在某一行,那就是那行代码的资源问题。

4. 调试时的小技巧

碰到“函数求值超时”别死等:

  • 先关掉所有断点,让程序跑一遍,看看浏览器控制台或者VS输出窗口有没有报错信息。
  • 在AJAX的error回调里加详细日志,能帮你定位前端请求的问题:
$.ajax({
    url: '/Home/Upload',
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false,
    success: function(res) {
        console.log('上传成功');
    },
    error: function(xhr, status, err) {
        console.log('请求状态:', status);
        console.log('错误详情:', err);
        console.log('响应内容:', xhr.responseText);
    }
});
  • 打开VS的“并行堆栈”窗口(调试→窗口→并行堆栈),能看到卡住的线程在等什么资源,比如是不是在等文件锁。

5. 排除浏览器缓存干扰

有时候浏览器缓存会搞事情,试试:

  • 按Ctrl+Shift+Delete清除缓存后再测试。
  • 用无痕/隐私窗口打开页面,避免本地缓存影响请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:57:41