调用来自许多用户的{j}请求时,MVC 5 Web应用程序停止工作

时间:2017-11-12 13:14:20

标签: c# ajax asp.net-mvc-5

我在C#中有一个非常基本的MVC项目。它的观看次数仅使用 ajax调用,通过eather GETPOST方法调用我拥有的控制器。该项目使用Entity框架让用户登录并使用控制器的操作(检查所调用的每个操作的凭据)。

当我最终开始为多个用户测试Web应用程序时,Web应用程序才停止响应。就像每个人的请求都在队列中一样,柜台上唯一的人说:“我正在休息时间”,这使得每个请求都等待而不会让它退出。我通过从用户每5-10秒登录一次的多个浏览器调用我的控制器的Test函数进行测试。

Test函数刚刚调用了该控制器中的其他函数之一,执行了它,并且没有返回任何内容,因为它调用的操作就是这种情况(用户正常调用)

我还调用了ajax测试代码记录每次调用启动和结束时的ID和时间。在这里,我注意到一个异常现象。它看起来像这样:

START 1
END 1
START 2
END 2
START 3
START 4
END 4
START 5
END 5
START 6
... //which eventualy brings us to
START 20
START 21
START 22
START 23
START 24
... // without any of these requests being resolved

我从未听过第3号电话的END

我在线阅读MVC查询每个请求,我认为这很可能是Web应用程序停止响应的原因。

我尝试使用[SessionState(SessionStateBehavior.Disabled)]所述here,结果相同。

许多客户将同时使用此Web应用程序,这是一种不可接受的行为。解决问题的方法之一"这是为了创建一个脚本,允许每个用户一次只进行1次ajax调用。但是当50个用户同时进行ajax呼叫时呢? (我无法对此进行测试,但我认为它会做同样的事情。由于我有5个浏览器,我设法测试了5个。)

为什么Web应用程序经常在ajax调用之后没有响应?为什么(如上例所示)调用No4比调用No3更重要?这不是一个FIFO堆栈!它是一个完整的Web应用程序。如何在没有Web应用程序崩溃的情况下允许用户从我的控制器调用和获取任何内容?

以下是我用来从控制器调用Test操作的代码:

// TESTING
var testCallCount = 0, testSuccessCount = 0, testFailCount = 0;
function StartTesting(caller) {
    $(caller).prop('disabled', true); // disables the button that's used to start the testing process
    var interval = 3 //RandomNumber(5, 10) 
                    * 1000;
    setInterval(function () {
        testCallCount++;
        var now = new Date
        console.log('CALLED-' + testCallCount + ' ' + now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds());

        var current = testCallCount;
        $.ajax({
            type: 'GET',
            url: '../Documents/Test',
            success: function () { testSuccessCount++; },
            error: function () { testFailCount++; },
            complete: function () { var text = TestCounts(testCallCount); console.log(text); }
        });
    }, interval);
}

function TestCounts(callNo) {
    var now = new Date();
    var text =
        "END-" + callNo + ' ' + now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds() +
        "\nT:" + testCallCount +
        "  S:" + testSuccessCount +
        "  F:" + testFailCount
    ;
    return text;
}

此外,我所有的ajax呼叫都采用这种形式(通过呼叫的时间和ID部分)。这是Test函数:

[HttpGet]
public void Test()
{
    var randNo = new Random().Next(0, 10);
    var testCatNo = 6;
    var testDocNo = 3856;
    switch (randNo)
    {
        case 0: UniversalForm(UniversalFormType.Category, testCatNo, null); break;
        case 1: NavTree(); break;
        case 2: SearchDatabase(SearchResultsType.Category, testCatNo, 0, null); break;
        case 3: FullTextSearch(0, "asd", true, true); break;
        case 4: ItemData(SearchDetailsType.Document, testDocNo); break;
        //case 5: CreateItem(EditType.Document, testCatNo, new List<UFParameter>()); break;
        case 6: SearchPermRequests(testCatNo, 0); break;
        case 7: ShowMyPermRequests(0); break;
        case 8: CheckMyAllowedPermRequests(); break;
        //case 9: Preview(testDocNo); break;
    }
}

注意我忘记说当我自己使用它来测试控制器方法时,网络应用程序运行正常(这意味着我不能做得更好当时有3个并发的ajax请求)。此外,每个操作平均需要大约4秒才能执行。使用适当的参数,Test操作调用的所有操作都可以正常工作,因此我对正确的值进行了硬编码,以确保Test操作始终返回且没有错误。

0 个答案:

没有答案