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());
                }
            }
        }
    }

ASP.asp.net MVC中,ajax请求不会被异步处理

MVC将同步处理同一用户发出的请求,所以当你启用会话时,你也启用了这个。

要允许操作被异步处理,你必须用[SessionState(system . web .SessionState.SessionState . behavior . readonly)]注释控制器,像这样:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class ParallelController : Controller
{
...
}

这在动作级别不起作用,所以您可能需要为正在讨论的动作使用单独的控制器。