ASP.NET MVC+jQuery Ajax:解决两个Ajax请求无法同时执行的问题
解决方案:让ASP.NET MVC中的Ajax请求并行执行
看起来你的问题核心是两个Ajax请求被串行执行了——第二个必须等第一个耗时的统计请求完成才能触发。要实现并行执行,我们需要从前端请求逻辑和后端并发支持两个方面调整:
一、前端:确保请求异步且独立触发
首先排查你的现有代码,大概率是下面两种情况导致串行:
- 第二个请求被嵌套在第一个请求的
success回调里; - 错误地设置了
async: false(同步请求会阻塞后续所有操作)。
修复后的代码示例:
1. 独立发起耗时的统计请求
页面加载时直接发起这个请求,不需要等待它完成:
// 页面加载后立即发起统计请求,后台默默执行 $(document).ready(function() { $.ajax({ url: '/Stats/GetTotalRecords', type: 'GET', async: true, // jQuery默认就是true,显式声明更清晰 success: function(total) { // 请求完成后再更新页面统计数据 $('#total-count').text(`总记录数:${total}`); }, error: function(xhr, status, err) { console.warn('统计请求失败:', err); } }); });
2. 按钮点击独立触发编辑Dto请求
把编辑请求的逻辑直接绑定到按钮点击事件,完全不受统计请求的影响:
// 绑定编辑按钮的点击事件,用户一点就发起请求 $('#open-edit-card-btn').on('click', function() { $.ajax({ url: '/Edit/GetEditModel', type: 'GET', async: true, success: function(dto) { // 拿到Dto后立刻打开编辑卡片 renderEditCard(dto); }, error: function(xhr, status, err) { alert('获取编辑数据失败,请稍后重试'); } }); });
关键是不要把第二个请求放在第一个请求的回调函数里,让两者的触发逻辑完全独立——这样页面加载时统计请求在后台跑,用户随时点击按钮都能立刻发起第二个请求,不用等统计完成。
二、后端:解除Session的并发限制
如果前端调整后还是串行,那大概率是ASP.NET的Session锁定问题——默认情况下,同一个用户的多个请求会因为Session独占而被串行处理(ASP.NET为了保证Session的一致性,会给每个用户的请求加锁)。
解决方法分两种情况:
- 如果你的控制器不需要使用Session,直接禁用Session:
[SessionState(SessionStateBehavior.Disabled)] public class StatsController : Controller { public ActionResult GetTotalRecords() { // 模拟5-7秒的耗时操作 System.Threading.Thread.Sleep(6000); return Json(15678, JsonRequestBehavior.AllowGet); } }
- 如果只需要读取Session(不需要修改),设置为只读Session:
[SessionState(SessionStateBehavior.ReadOnly)] public class EditController : Controller { public ActionResult GetEditModel() { // 快速返回编辑Dto var editDto = new { Id = 123, Title = "测试编辑项", Content = "示例内容" }; return Json(editDto, JsonRequestBehavior.AllowGet); } }
设置后,同一个用户的多个请求就能在后端并行处理了,不会因为Session锁导致串行。
总结
只要做到这两点:
- 前端请求异步且独立触发,不嵌套回调
- 后端解除Session的并发限制
就能实现两个请求同时执行,用户点击编辑按钮时无需等待统计请求完成,直接就能打开编辑卡片进行操作。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

