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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:58:19