【问题标题】:Internal Server Error - 500 while making simultaneous AJAX requests in ASP.NET MVC4内部服务器错误 - 在 ASP.NET MVC4 中同时发出 AJAX 请求时出现 500
【发布时间】:2023-03-25 19:30:01
【问题描述】:
function InitializeCharts() {
 for (var i = 0; i < arguments.length; i++) {
     compName = arguments[i];
     $.ajax({
         async:true,
         timeout: 60000,
         dataType: "json",
         url: "/SalesDashboard/GetChartData",
         data: { company: compName, from: startDate, to: endDate },
         success: (function () {
             var cmp = compName;
             return function (data) {
                 ChartData[cmp] = data;
                 PrepareChart(data, cmp);
             };
         })(),
         error: function (xhr, ajaxOptions, thrownError) {
             console.log(xhr.status+': '+xhr.statusText);                
             console.log(thrownError);
         }
     });
 }
}

我在客户端使用上述函数来发出 AJAX 请求并获取一些数据。当我像这样调用函数时它工作正常:

InitializeCharts("ABC"); // A Single parameter

它适用于单个请求,但是当我传递多个如下参数时,它会创建多个同时请求并给我“Internal Server Error -500”错误。

InitializeCharts("ABC", "BBC", "CCC", "DDD", "EEE", "ACD", "CBD", "CDS", "ADB"); // Multiple parameters

它给了我一些随机公司的错误,有时是两个,有时是三个或四个。 我尝试将 AJAX 请求中的超时时间增加到 60000,但它不起作用。我还通过了 IIS 服务器并将连接超时增加到 3 分钟,但仍然得到相同的响应。我知道将数据返回给客户端甚至不需要一分钟。如果我将 ajax 请求中的“async”值设置为 false,它会起作用,但会阻止 UI,直到为所有公司返回数据。

以下是我的服务器端代码:

static int hitCount = 0;
private string ConnectionString = "server=localhost;database={0};uid=test;password=test;pooling=false;";

private string QueryString_Daily = "SELECT Day(mergefiledate) AS `Date`, COUNT(order_no) AS `Count` FROM orders_new WHERE DATE(mergefiledate)>='{0}' and Date(mergefiledate)<='{1}' GROUP BY DATE(mergefiledate);";

public Task<string> GetChartData(string company, string from, string to)
    {
        hitCount++;
        return Task.Factory.StartNew(() => GetData(company, from, to));
    }

private string GetData(string company, string from, string to)
    {            
         string QuerySTR = string.Empty;
         QuerySTR = string.Format(QueryString_Daily, startDt.ToString("yyyy-MM-dd"), endDt.ToString("yyyy-MM-dd"));
         MySqlConnection mycon = new MySqlConnection(string.Format(ConnectionString, company));
        MySqlCommand cmd = new MySqlCommand(QuerySTR, mycon);
        cmd.CommandTimeout = 0;
        DataTable dt = new DataTable();
        try
        {
            mycon.Open();
        }
        catch (Exception ex)
        {
            Response.Write("<script>alert('Database connection error, please try again. ERROR_DETAILS: '" + ex.Message + "');</script>");
            return null;
        }

        if (mycon.State == ConnectionState.Open)
        {

            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            da.Fill(dt);

        }

        if (mycon.State == ConnectionState.Open)
        {
            try
            {
                mycon.Close();
            }
            catch { }
        }

        if (dt.Rows.Count > 0)
        {
    var result = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
             return result;
     }
    else
     {
            return null;
         }

    }

我一直在尝试通过谷歌搜索找出解决方案,在 stackoverflow.com 上进行挖掘……等等,但还没有运气。 非常感谢您的帮助,在此先感谢您。

【问题讨论】:

  • 能否让这些ajax请求同步使用-async:false
  • 是的,我可以而且我已经这样做了,但是我在同时发出多个请求时遇到了错误。
  • 这确实是服务器问题。有后台代码吗?可以调试吗?它会记录错误吗?
  • 这看起来更像是服务器端错误...您可能想要调试您的 c# 代码并在那里查找问题。同时发出多个请求是否会抛出异常?
  • 您的图表生成代码看起来有些问题 - 当您有多个请求时,您会同时运行该代码的多个副本。仔细验证您的代码的线程安全性。

标签: c# asp.net-mvc jquery


【解决方案1】:

非常感谢大家的努力。我得到了解决方案。我的印象是我使用下面的语句将命令超时设置为无限,但实际上我错了:

cmd.CommandTimeout = 0;

我将超时时间修改为:

cmd.CommandTimeout = 600;

而且效果很好。再次感谢每一个小小的帮助。

【讨论】:

  • 我知道! MySQL超时很糟糕! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多