【问题标题】:Ajax async call Asp.net not giving proper outputAjax 异步调用 Asp.net 没有给出正确的输出
【发布时间】:2016-01-14 22:14:33
【问题描述】:

我有两个期望异步运行的 ajax 调用

        var toDate = '<%=ucChartDateSelector1.ToDate%>';
        var fromdate = '<%=ucChartDateSelector1.FromDate%>';
        var reportFor = '<%=ucChartDateSelector1.ddlReportType.SelectedItem.Text%>';
        var periodFor = '<%=ucChartDateSelector1.ddlDateSelection.SelectedItem.Text%>';

        $(document).ready(function () {
               GenerateChartReport();
        });

        function GenerateChartReport() {
            $.ajax({
                type: 'POST',
                url: 'Dashboard.aspx/ReadBooking',
                contentType: 'application/json',
                dataType: 'json',
                async: true,
                data: JSON.stringify({ fromDate: fromdate, toDate: toDate, reportFor: reportFor, periodFor: periodFor }),
                success: function (response) {
                    TwoColumnReport(response.d, "chartLine_div", "Google Dealy Example");

                },
                error: function (error) {
                    console.log(error);
                }

            }),
            $.ajax({
                type: 'POST',
                url: 'Dashboard.aspx/GetData', 
                contentType: 'application/json',
                dataType: 'JSON',
                async: true,
                success: function (response) {
                    TwoColumnReport(response.d, "visualization", "Google Charts Example");
                },
                error: function (error) {
                    console.log(error);
                }

            });

            return false;
        }
        function TwoColumnReport(dataValues, mainDivId, reportTitle) {
            var data = new google.visualization.DataTable();
            data.addColumn('string', 'Column Name');
            data.addColumn('number', 'Column Value');

            for (var i = 0; i < dataValues.length; i++) {
                data.addRow([dataValues[i].ColumnName, dataValues[i].Value]);
            }
            new google.visualization.PieChart(document.getElementById(mainDivId)).
               draw(data, { title: reportTitle });
        }

在服务器端,我有以下代码。一个函数有 2 秒的延迟,另一个函数有 5 秒的延迟。

[WebMethod]
public static List<Data> GetData()
{
    logger.WriteInfoLog(String.Format("***********GetData Start**********    "));
    int milliseconds = 2000;
    Thread.Sleep(milliseconds);
    List<Data> dataList = new List<Data>();

    dataList.Add(new Data("Column 1", 100));
    dataList.Add(new Data("Column 2", 200));
    dataList.Add(new Data("Column 3", 300));
    dataList.Add(new Data("Column 4", 400));
    logger.WriteInfoLog(String.Format("*********GetData End**********"));
    return dataList;
}

[WebMethod]
public static List<Data> ReadBooking(String fromDate, String toDate, String reportFor, String periodFor)
{
    logger.WriteInfoLog(String.Format("---------ReadBooking Summary Start.   Report type {0}-{3}  DateRange {1}- {2}----- ", reportFor, fromDate, toDate, periodFor));
    int milliseconds = 5000;
    Thread.Sleep(milliseconds);
    List<Data> dataList = new List<Data>();

    dataList.Add(new Data("row 1", 1400));
    dataList.Add(new Data("row 2", 3200));
    dataList.Add(new Data("row 3", 3100));
    dataList.Add(new Data("row 4", 4100));
    dataList.Add(new Data("row 5", 2400));
    logger.WriteInfoLog(String.Format("---------ReadBooking Summary. End----- "));
    return dataList;
}

我希望日志按以下顺序排列:

 --------ReadBooking Summary Start.   Report type Weekly -11 Jan 2016 
   DateRange 11/01/2016 12:00:00 AM- 17/01/2016 12:00:00 AM-----  
   ***********GetData Start**********
        *********GetData End********** 
       ---------ReadBooking Summary. End-----

但我得到的输出是:

 ---------ReadBooking Summary Start.   Report type Weekly -11 Jan 2016  DateRange 11/01/2016 12:00:00 AM- 17/01/2016 12:00:00 AM----- 
---------ReadBooking Summary. End----- 
***********GetData Start**********
*********GetData End**********

我错过了什么?

【问题讨论】:

  • 您是否检查了开发工具上的网络选项卡以执行 Ajax 调用?检查是否在第一次或 5 秒后立即进行第二次 ajax 调用?
  • 您可能想检查与该问题类似的其他问题。似乎 asp.net 会话处理队列中的请求。看看这个stackoverflow.com/questions/4428413/…
  • 我现在有点远离 ASP.NET 但似乎Thread.Sleep()call 在给定的时间内停止了整个脚本。两个呼叫都被触发,但第一个呼叫将第二个呼叫锁定。也许是因为两者都在同一个线程上运行。
  • 在 NetworkTab 中,显示两者同时启动。但是日志不是预期的方式。可能是线程可能已经锁定了日志写入!

标签: jquery asp.net ajax


【解决方案1】:

在 ASP.NET 中,如果两个请求来自同一个会话,它们将获得对 SessionState 的独占访问权限,也就是它们按顺序运行,而不是并行运行。

在您的示例中,它们都同时被触发,但是无论哪个第二个到达都会被放入队列中,直到第一个完成,因为它们都来自 Session(基于 SessionId)。

您可以通过将以下属性应用于您的控制器来规避该问题:

[SessionState(SessionStateBehavior.Disabled)]

当然,您将无法访问 HttpContext.Current.Session 属性(嗯,您可以,但它将是 null)

更多参考资料:

【讨论】:

  • 发誓,你已经澄清了我的疑问,即使他们一起被解雇,日志不会同时发生的原因。我会检查你给的建议
  • 我正在使用 Webforms 并且无法禁用会话状态,因为我在代码中使用会话变量
  • 如果你不能禁用会话状态,很遗憾没有其他办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2015-08-20
  • 2020-05-06
相关资源
最近更新 更多