长时间运行jqueryajax调用

长时间运行jqueryajax调用,jquery,asp.net-web-api,Jquery,Asp.net Web Api,我有jqueryajax调用,它从webapi服务请求汇总计数。WEB API处理请求并调用一个存储过程(sql server),传递请求参数。存储过程需要更长的时间(处理请求需要10分钟以上)。如果存储过程需要10分钟以上,jQuery AJAX调用将报告一个未知错误,状态代码为12002或12152(这些错误与连接问题有关)但是Web服务器在10分钟后收到存储过程返回的结果。问题出现在浏览器IE8.0、IE9.0和firefox上,但chrome即使等待超过10分钟也会收到响应。是否有任何解

我有jqueryajax调用,它从webapi服务请求汇总计数。WEB API处理请求并调用一个存储过程(sql server),传递请求参数。存储过程需要更长的时间(处理请求需要10分钟以上)。如果存储过程需要10分钟以上,jQuery AJAX调用将报告一个未知错误,状态代码为12002或12152(这些错误与连接问题有关)但是Web服务器在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;
        }
$.ajax({
类型:“post”,
url:URLPrefix+“api/querydispatcher/summary”,
数据:s,
成功:功能(数据){
窗口清除间隔(int);
$('#wait').hide();
$('#CancelSummary').hide();
$('#backgroundmodal').hide();
$(“#tResultTotals”).slideDown('slow');
反序列化JSON(eval(data));
如果(!CancelSummaryRequest){
CancelSummaryRequest=true;
$(“#下载详细报告”).show();
}
否则{
$('#tResultTotals').hide();
}
},
$('#wait').hide();
$('#CancelSummary').hide();
$('#backgroundmodal').hide();
错误对话框(request.responseText);
}
});
}
服务器端(WebAPI)代码。
[WebInvoke(UriTemplate=“summary”,Method=“POST”)]
公共列表GetSummaryReport_队列(JsonValue SummaryXML)
{
MyContext db=新的MyContext();
DateTime StartTime=DateTime.Now;
字符串sumXML=SummaryXML[“XMLJson”].ToString().Replace(@“\”,“”)。Replace(@“”,“”);
//这是由JSon在字符串末尾创建的两个代码,需要进行修剪。
sumXML=sumXML.Replace(“u000du000a”,“u000du000a”);
列表结果=空;
XElement xxml=XElement.Parse(sumXML);
字符串ReportID=xxml.substands(“ReportID”).FirstOrDefault().Value;
字符串err=“”;
尝试
{
results=db.fnReportResult(sumXML.ToList();
}
捕获(例外e)
{
err=e.Message+”:“+(e.InnerException!=null?e.InnerException.Message:”);
投掷e;
}
最后{
///---记录审计信息。
double RunningTime=DateTime.Now.Subtract(StartTime.total毫秒);
string parameters=“ApplicationType:Query_Dispatcher”+”|| User:“+SummaryXML[“UserId”]。ToString()。替换(@“\”,“”)。替换(@“”,“”)+
“||会话:”+SummaryXML[“会话”].ToString().Replace(@“\”,“”)。Replace(@“”,“”)+
||运行时间:“+RunningTime.ToString()+”||请求类型:摘要报告”+
“| |报告ID:”+ReportID+
“| |错误:”+错误;
Audit SaveAudit=新审核();
SaveAudit.WriteAudit(“查询生成器”,参数);
//####-记录审计信息
}
返回结果;
}

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

正如其他人所说,等待10分钟的AJAX响应是非常糟糕的,大多数浏览器可能会在其默认设置中为您超时,即使您将AJAX超时设置得非常高。我怀疑您是否能够实现这一点


您可以按照其他人所说的操作,运行查询,然后向用户发送一个指向结果的链接。但是,另一种解决方案是每x分钟在cron上运行一次查询,并缓存结果。这样,用户可以根据需要查看结果,而不必等待新的url或长时间等待。

我不会让连接等待10分钟min-我会向
/whatever
发出
POST
req,它会立即响应
202接受的
和正在创建的资源的URL[例如
/whatever/hashOfSomething
]。然后在10分钟后访问该URL-如果资源已准备就绪,则使用它进行操作,否则在N分钟后重试。我如何从客户端再次访问该URL(/whatever/),以检查记录是否已被处理?存在“超时”Ajax调用的选项——你试过将它设置为高于600000毫秒的值吗?我尝试了AJAX时间到600000,它似乎并没有帮助,无论如何,等待浏览器内的10分钟交付一些东西对我来说似乎不是一个有效的选择。