多个ajax请求非常缓慢的mvc应用程序

3
我有一个ASP MVC4应用程序,它加载了一个小部件仪表板。每个小部件执行异步ajax回调到服务器,并返回部分内容。
由于某种原因,这些小部件需要大约50秒才能用部分内容替换内容。Ajax请求是瞬时的,数据库查询在数据库端也是瞬时的。大多数情况下,这个工作正常,但我认为这可能与网站的高使用率有关。
有没有人可以推荐我可以做些什么来调试此问题或确定瓶颈可能是什么?
$.ajax({
            cache: true,
            type: 'post',
            async: true,
            url: '/Overview/GetBillingWidget/',
            success: function (result3) {

                if (result3 == '') {
                    $('.widget-billing-container').replaceWith('');
                } else {
                    $('.widget-billing').html(result3);
                }

            },
            error: function () {

            }

        });
$.ajax({
        cache: true,
        type: 'post',
        async: true,
        url: '/Overview/GetQueryWidget/',
        success: function (result3) {

            if (result3 == '') {
                $('.widget-myquery-container').replaceWith('');
            } else {
                $('.widget-myquery').html(result3);
            }

        },
        error: function () {

        }

    });

如果您使用会话,请调查阻塞情况。会话访问是串行的,当多个请求在大致相同的时间访问它时,阻塞可能会导致性能不佳。 - Tim M.
是的,我们通常使用会话来实现这个功能。您所说的阻塞是什么意思? - CR41G14
ASP.Net 在请求开始时对 Session 进行锁定。如果另一个请求在锁定释放之前启动,则必须等待其他请求完成,我相信会增加 500 毫秒的延迟。(参见 https://dev59.com/W3A65IYBdhLWcg3wyh57) - Tim M.
1个回答

3

我在一个类似的仪表板应用程序中遇到了同样的问题,正如评论所建议的那样,这是会话锁定的问题。默认情况下,当调用控制器操作时,会话将被锁定,直到它存在,因此在此期间发生的任何调用都必须等待其释放。

然而,通过一些巧妙的编码,您可以完全避免使用会话变量,最好是通过存储和读取数据库中的数据来完成。如果您的控制器仅读取会话变量(或根本不使用它们),则可以在控制器类的顶部添加此属性:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

这应该可以解决您在向控制器发起并行ajax调用时可能遇到的许多锁定问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接