我在C#中有一个非常基本的MVC项目。它的观看次数仅使用 ajax调用,通过eather GET
或POST
方法调用我拥有的控制器。该项目使用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
操作始终返回且没有错误。