Javascript ASP.NETMVCAJAX请求触发一次,然后将不再触发

Javascript ASP.NETMVCAJAX请求触发一次,然后将不再触发,javascript,c#,jquery,ajax,asp.net-mvc,Javascript,C#,Jquery,Ajax,Asp.net Mvc,我正在尝试开发一个ASP.NETMVC页面,在表单发布期间显示长时间运行的操作的进度。我通过使用一个重复出现的Ajax请求来实现这一点,该请求在发布文章时获取JSON数据(最初的想法基于)。我的示例是有效的,但是在多次运行后会出现一些奇怪的情况。第一次执行时,一切正常,一切正常。在第一次运行之后,后续的JSON请求将失败,直到我在调试中重新启动应用程序(从VisualStudio)或回收应用程序池(如果它已部署到我们的开发服务器)。表单post本身继续正常运行,并且它正在执行的存储过程也正常工作

我正在尝试开发一个ASP.NETMVC页面,在表单发布期间显示长时间运行的操作的进度。我通过使用一个重复出现的Ajax请求来实现这一点,该请求在发布文章时获取JSON数据(最初的想法基于)。我的示例是有效的,但是在多次运行后会出现一些奇怪的情况。第一次执行时,一切正常,一切正常。在第一次运行之后,后续的JSON请求将失败,直到我在调试中重新启动应用程序(从VisualStudio)或回收应用程序池(如果它已部署到我们的开发服务器)。表单post本身继续正常运行,并且它正在执行的存储过程也正常工作。似乎表单帖子本身正在阻止它们,但奇怪的是,这不是第一次发生

我尝试了各种方法禁用Ajax缓存。我在jQuery中完成了提交功能,因为提交它的按钮实际上位于一个单独的弹出窗口中。但是,如果我删除它并使用普通的提交按钮,也会发生同样的情况。数据库连接是Oracle和实体框架。我试图应用的概念对我来说似乎是一种代码味道,因为在另一个过程中会发生请求,所以如果有更好的方法来实现这一点,但我没有发现,我愿意接受。如果这种方法很好,那么有人知道为什么JsonResult的后续提交可能不会发生吗

更新

我注意到,当我清除浏览器缓存时,它也允许它重新开始工作。我没想到会这样做,因为在Chrome中调试缓存被禁用时,仍然会发生这种情况。罪魁祸首似乎是会话或ASP.NET_会话ID cookie。当手动删除cookie并重新建立会话时,它会工作。SetInfoNotification调用将一些数据放入TempData中,以便在notifications div中显示。如果删除此调用,它也将继续工作。在进行Ajax调用的请求过程中使用会话或TempData时,是否存在可能挂起的问题

控制器动作

[HttpPost]
public ActionResult RunCalcPost(MONTHLY_RUN monthRun)
{
    try
    {
        MyContext.Database.ExecuteSqlCommand("BEGIN MY_SCHEMA.MY_STORED_PROCEDURE; END;");
        setInfoNotification($"Calculations for \"{monthRun.RUN_ID}\" have completed successfully");
    }
    catch(Exception e)
    {
        setErrorNotification(e, "An error occurred while executing the monthly run.");
    }
    return RedirectToAction("Index", new { runID = monthRun.RUN_ID });
}

[HttpGet]
public JsonResult CheckStatus(string runID)
{
    string status = "";
    try
    {
        MONTHLY_RUN monthRun = MyContext.MonthlyRuns
             .FirstOrDefault(x => x.RUN_ID == runID);
        if (monthRun != null)
        {
            string calc = monthRun.IS_CALCULATED;
            switch (calc)
            {
                case "1": status = "Step 1 of 8: Clearing temporary tables..."; break;
                case "2": status = "Step 2 of 8: Reticulating Splines..."; break;
                ...
                default: status = "Determining status, please wait..."; break;
            }
        }
        else
        {
            status = "Error in finding ID...please wait.";
        }
    }
    catch
    {
        status = "Controller error determining progress...please wait.";
    }
    return Json(new { success = true, message = status }, JsonRequestBehavior.AllowGet);
}
视图中(JavaScript)


var currentRunID=“@(Model.RUN_ID)”;
$(文档).ready(函数(){
$('#MyForm')。提交(函数(事件){
HideConfirmation();
ProcessingLoader.Show();
setTimeout(GetProcessStatus,2000);
});
});
函数OnProcessConfirm(s,e){
$(“#我的表格”).submit();
}
函数GetProcessStatus(){
$.ajax({
键入:“获取”,
url:“@url.Action”(“CheckStatus”,“MonthlyRuns”)”,
数据:{runID:currentRunID},
数据类型:“json”,
cache:false,
成功:函数(response){$(“#loadingMessage”).text(response.message);},
完成:函数(){setTimeout(GetProcessStatus,2000);}
});
}

只是一个猜测,但问题可能是来自提交的

您正在为提交
#MyForm
创建一个事件处理程序:

$(document).ready(function () {
    $.ajaxSetup({ cache: false });
    $('#MyForm').submit(function (event) {
        HideConfirmation();
        ProcessingLoader.Show();
        setTimeout(GetProcessStatus, 2000);
    });
});
我怀疑,您的表单正在被一个新表单替换,在此过程中,或者由于某种原因,您正在丢失表单的提交事件绑定

您可以尝试将submit事件绑定到正文,这样即使表单被另一个表单替换,您仍然可以获得submit事件处理程序:

$(document).ready(function () {
    // try binding the submit event handler to document's body
    $('body').on("submit", "#MyForm", function(event){
        HideConfirmation();
        ProcessingLoader.Show();
        setTimeout(GetProcessStatus, 2000);
    });
});

这只是一个猜测,但问题可能出在提交的文件上

您正在为提交
#MyForm
创建一个事件处理程序:

$(document).ready(function () {
    $.ajaxSetup({ cache: false });
    $('#MyForm').submit(function (event) {
        HideConfirmation();
        ProcessingLoader.Show();
        setTimeout(GetProcessStatus, 2000);
    });
});
我怀疑,您的表单正在被一个新表单替换,在此过程中,或者由于某种原因,您正在丢失表单的提交事件绑定

您可以尝试将submit事件绑定到正文,这样即使表单被另一个表单替换,您仍然可以获得submit事件处理程序:

$(document).ready(function () {
    // try binding the submit event handler to document's body
    $('body').on("submit", "#MyForm", function(event){
        HideConfirmation();
        ProcessingLoader.Show();
        setTimeout(GetProcessStatus, 2000);
    });
});

我终于明白了。根据,这似乎是由于会话状态读/写权限的限制。我要做的是将存储过程操作分解到它自己的控制器中,并将此属性添加到其中:

[SessionState(SessionStateBehavior.ReadOnly)]  //Disabled also worked
在我看来,这是一种愚蠢的行为,因为我没有在Ajax帖子上处理会话数据,但我猜它们自己会与会话数据交互。另外,作为补充说明,使用Ajax.beginnform助手似乎更加流畅。这有助于清理这一点

@using (Ajax.BeginForm("RunCalcPost", "Tasks",  new AjaxOptions { HttpMethod = "POST", 
    OnBegin="OnFormBegin", OnComplete = "OnFormComplete", OnSuccess = "OnFormSuccess", 
    OnFailure = "OnFormFailure" }))

我终于明白了。根据,这似乎是由于会话状态读/写权限的限制。我要做的是将存储过程操作分解到它自己的控制器中,并将此属性添加到其中:

[SessionState(SessionStateBehavior.ReadOnly)]  //Disabled also worked
在我看来,这是一种愚蠢的行为,因为我没有在Ajax帖子上处理会话数据,但我猜它们自己会与会话数据交互。另外,作为补充说明,使用Ajax.beginnform助手似乎更加流畅。这有助于清理这一点

@using (Ajax.BeginForm("RunCalcPost", "Tasks",  new AjaxOptions { HttpMethod = "POST", 
    OnBegin="OnFormBegin", OnComplete = "OnFormComplete", OnSuccess = "OnFormSuccess", 
    OnFailure = "OnFormFailure" }))

你说的“第一次执行时,一切正常”是什么意思。。。这是否意味着您可以成功地发出多个ajax请求?在长时间运行的任务完成之前?任务完成后,如何停止Ajax调用?正确。第一次运行较长的任务时,它会执行Ajax请求,直到表单提交完成,正如预期的那样。一旦我再次尝试提交它,较长的过程仍然有效,但Ajax帖子只是坐在那里等待。我依靠表单提交本身来打破递归Ajax调用。是否有不同的终止方式?你说的“第一次执行时,一切正常”是什么意思。。。这是否意味着您可以成功地发出多个ajax请求?在长时间运行的任务完成之前?任务完成后,如何停止Ajax调用?正确。第一次运行较长的任务时,它会执行Ajax请求,直到表单提交完成