如何通过Ajax异步并行调用多个JsonResult函数并获取响应
问题分析与解决方案
问题原因
你遇到的两个请求串行执行的核心问题,是ASP.NET的Session锁机制:默认情况下,ASP.NET会给同一个用户Session的所有请求加排他锁,同一时间只能处理该Session下的一个请求,其他请求必须排队等锁释放,自然就没法并行执行。
解决方案
1. 后端调整:解除Session锁限制
如果你的GetData和GetDataOne方法不需要访问Session,直接给对应Controller或者Action添加[SessionState(SessionStateBehavior.Disabled)]特性,ASP.NET就不会对这些请求加锁,允许并行处理。
修改后的后端代码:
using System.Web.Mvc; using System.Web.SessionState; [SessionState(SessionStateBehavior.Disabled)] public class LayoutController : Controller { public JsonResult GetData(string name) { JsonResult result = new JsonResult(); TestModel model = new TestModel(); model = GetDataresult(name); result.MaxJsonLength = int.MaxValue; return Json(model, JsonRequestBehavior.AllowGet); } public JsonResult GetDataOne(string name) { JsonResult result = new JsonResult(); TestModel model = new TestModel(); model = GetDataresultSet(name); result.MaxJsonLength = int.MaxValue; return Json(model, JsonRequestBehavior.AllowGet); } }
如果方法必须读取Session(不需要写入),可以改用[SessionState(SessionStateBehavior.ReadOnly)],只读Session的锁是共享锁,支持多个请求并行。
2. 前端优化:用Promise更优雅处理并行请求
你的前端AJAX已经设置了async: true,这是并行请求的基础配置,无需修改。可以改用Promise.all来统一处理两个请求的结果,代码更清晰:
$(document).ready(function() { // 把AJAX包装成Promise function getDataPromise(url) { return new Promise((resolve, reject) => { $.ajax({ url: url, type: 'GET', async: true, dataType: 'JSON', data: { name: "test name" }, success: resolve, error: reject }); }); } // 并行发起两个请求 Promise.all([ getDataPromise('../Layout/GetData'), getDataPromise('../Layout/GetDataOne') ]).then(([data1, data2]) => { // 两个请求都成功后的处理逻辑 console.log('GetData返回结果:', data1); console.log('GetDataOne返回结果:', data2); }).catch(error => { // 处理请求失败的情况 console.error('请求出错:', error); }); });
注意:GET请求不需要设置
contentType: 'application/json; charset=utf-8',这个配置是针对POST请求提交JSON体的,GET请求没有请求体,留着反而多余。
内容的提问来源于stack exchange,提问作者Mohan Madhugundu
相关产品推荐
相关产品推荐

