长时间运行jQuery Ajax调用

时间:2013-02-08 15:11:08

标签: jquery asp.net-web-api

我有jQuery AJAX调用请求来自WEB API服务的摘要计数。 WEB API处理请求并调用传递请求参数的存储过程(sql server)。存储过程需要更长的时间(超过10分钟来处理请求。如果存储过程花费超过10分钟,则jQuery AJAX调用报告状态代码为12002或12152的未知错误(这些错误与连接问题有关)但是Web Server在10分钟后从存储过程中收到结果。浏览器出现的问题是IE8.0,IE9.0,firefox但是chrome即使等待超过10分钟也会收到响应。是否有任何解决方案可以保留服务器和客户端之间的通信活动。我尝试将连接请求标头从ajax更改为“关闭”,“打开”,“保持活动”没有任何作用。请帮助我。

Java脚本代码。

$.ajax({
type: "post",
url: URLPrefix + 'api/querydispatcher/summary',
data: s,
success: function (data) {
window.clearInterval(int);
$('#wait').hide();
$('#CancelSummary').hide();
$('#backgroundmodal').hide();
$("#tResultTotals").slideDown('slow');
DeserializeJSon(eval(data));
     if (!CancelSummaryRequest) {
           CancelSummaryRequest = true;
          $('#DownloadDetailedReport').show();
    }
            else {

                $('#tResultTotals').hide();
            }
        },
            $('#wait').hide();
            $('#CancelSummary').hide();
            $('#backgroundmodal').hide();
            error_Dialog(request.responseText);
        }

    });
}

Server Side (WEB API) code.

  [WebInvoke(UriTemplate = "summary", Method = "POST")]
        public List<QueryResult> GetSummaryReport_Queue(JsonValue SummaryXML)
        {
            MyContext db = new MyContext();
            DateTime StartTime = DateTime.Now;

            string sumXML = SummaryXML["XMLJson"].ToString().Replace(@"\", "").Replace(@"""", "");
            //These are two codes created by JSon @ the end of the String that need to be trim off.
            sumXML = sumXML.Replace("u000du000a", "");

            List<QueryResult>  results = null;

            XElement xxml = XElement.Parse(sumXML);
            string ReportID = xxml.Descendants("ReportId").FirstOrDefault().Value;

            string err = "";
            try
            {

                results = db.fnReportResult(sumXML).ToList();
             }
            catch (Exception e)
            {

                err = e.Message + " : "+(e.InnerException!=null?e.InnerException.Message : "");
                throw e;
            }
            finally {
                ///--- Record Audit Info.
                double RunningTime = DateTime.Now.Subtract(StartTime).TotalMilliseconds;
                string parameters = "ApplicationType:Query_Dispatcher" + "||User:" + SummaryXML["UserId"].ToString().Replace(@"\", "").Replace(@"""", "") +
                        "||Session:" + SummaryXML["Session"].ToString().Replace(@"\", "").Replace(@"""", "") +
                        "||Running Time:" + RunningTime.ToString() + "||Request Type:Summary Report" +
                        "||Report ID:" + ReportID +
                        "||Error:" + err;

                Audit SaveAudit = new Audit();
                SaveAudit.WriteAudit("Query_Builder", parameters);
                //####-Recording Audit Info
            }

            return results;
        }

1 个答案:

答案 0 :(得分:0)

浏览器内置了内部超时,可能会影响到这一点。有关详细信息,请参阅此StackOverflow问题:Browser Timeouts

正如其他人所说的那样,等待10分钟的AJAX响应是非常糟糕的,大多数浏览器可能会将你的默认设置计时 - 即使你将AJAX超时设置为荒谬的高。我怀疑你会不会这样做。

您可以像其他人说的那样执行并运行查询,然后向用户发送指向结果的链接。但是,另一种解决方案是每隔x分钟在cron上运行查询并缓存结果。这样,用户可以按需查看结果,而不必等待新的网址或等待很长一段时间。