ASP.asp.net MVC中,ajax请求不会被异步处理
本文关键字:异步 处理 请求 ajax net asp MVC ASP | 更新日期: 2023-09-27 18:16:10
我有一个大的应用程序项目,我们已经工作了一段时间了。我有90%的把握这是一个新问题,实际上以前没有问题。
当我调用两个ajax请求时,第二个请求在处理之前等待第一个请求完成。当我检查网络流量时,我可以看到客户端(浏览器)向服务器发送两个请求,但似乎是服务器一次只处理一个请求。
我不明白这是什么。我发现答案说,它可能是属性enableSessionState,使MVC服务请求同步,所以我看了看,没有帮助。我开始了一个新的MVC 4项目,并制作了一个示例代码,它完全像我想要的那样工作。我们的主要项目一定是出了什么问题。
我会张贴一些代码。重点是我想要开始一个需要一段时间才能完成的程序。然后从日志中读取以向用户显示进度信息。但是现在这个过程开始了,当它结束时,用户得到了在最后同时收集到的所有信息。但是,当它工作时,就像在新项目中一样,当缓慢的过程仍在执行时,用户可以一块一块地获取信息。
有没有人有什么想法可以帮助我?给我指明正确的方向,在哪里寻找更多?
视图:
@{
ViewBag.Title = "Index";
}
<style>
.calculation {
overflow-y:scroll;
width:400px;
height:600px;
background-color:#eee;
border:solid 1px #000;
padding:10px;
}
</style>
<script src="~/Scripts/jquery-1.8.2.js"></script>
<h2>Index</h2>
<div class="calculation"></div>
<script>
$(function () {
$.ajax({
type: 'POST',
url: 'Calculation/DoSlowCalculation',
contentType: 'application/json; charset=utf-8'
});
function readLog() {
$.ajax({
type: 'POST',
url: 'Calculation/ReadCalculationLog',
contentType: 'application/json; charset=utf-8',
success: function (log) {
var completed = false,
div = $('.calculation');
for (var c1 = 0, l = log.length; c1 < l; c1++) {
div.prepend('<div>' + log[c1].LogText + '</div>');
if (log[c1].Complete) { completed = true; }
}
if (completed) {
alert('Calculation completed');
}
else {
setTimeout(function () {
readLog();
}, 1000);
}
}
});
}
readLog();
});
</script>
控制器:
public class CalculationController : Controller
{
public ActionResult Index()
{
return View("Index");
}
public void DoSlowCalculation()
{
using (var conn = new SqlConnection("Server=.;Database=SlowCalculationDB;Trusted_Connection=True;"))
{
using (var cmd = new SqlCommand(@"
INSERT INTO Log
VALUES ('Starting calculation', GETDATE(), 0, 0);
WAITFOR DELAY '00:00:04'
INSERT INTO Log
VALUES ('Some more calculation...1', GETDATE(), 0, 0);
WAITFOR DELAY '00:00:04'
INSERT INTO Log
VALUES ('Some more calculation...2', GETDATE(), 0, 0);
WAITFOR DELAY '00:00:04'
INSERT INTO Log
VALUES ('Some more calculation...3', GETDATE(), 0, 0);
WAITFOR DELAY '00:00:04'
INSERT INTO Log
VALUES ('Some more calculation...4', GETDATE(), 0, 0);
WAITFOR DELAY '00:00:04'
INSERT INTO Log
VALUES ('Ends calculation', GETDATE(), 0, 1);
", conn))
{
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
public ActionResult ReadCalculationLog()
{
using (var conn = new SqlConnection("Server=.;Database=SlowCalculationDB;Trusted_Connection=True;"))
{
using (var cmd = new SqlCommand(@"
SELECT LogText, LogTime, Complete FROM Log WHERE [Read] = 0;
UPDATE Log SET [Read] = 1;
", conn))
{
conn.Open();
var dt = new DataTable();
var sqlAdapter = new SqlDataAdapter(cmd);
sqlAdapter.Fill(dt);
var logs = from l in dt.AsEnumerable()
select new
{
LogText = l.Field<string>("LogText"),
LogTime = l.Field<DateTime>("LogTime").ToString("HH:mm:ss"),
Complete = l.Field<bool>("Complete")
};
return Json(logs.ToList());
}
}
}
}
MVC将同步处理同一用户发出的请求,所以当你启用会话时,你也启用了这个。
要允许操作被异步处理,你必须用[SessionState(system . web .SessionState.SessionState . behavior . readonly)]注释控制器,像这样:
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class ParallelController : Controller
{
...
}
这在动作级别不起作用,所以您可能需要为正在讨论的动作使用单独的控制器。