【问题标题】:How to cancel MVC action if I use AJAX to call it?如果我使用 AJAX 调用它,如何取消 MVC 操作?
【发布时间】:2016-05-31 05:01:30
【问题描述】:

我在视图上有一个 AJAX 函数,它调用我的一个控制器上的 Action 来获取 JSON 对象。问题是创建对象需要一段时间。如果用户重新加载页面,则 AJAX 调用会再次运行。据我所知,该操作仍在从最后一个请求开始运行,但响应不再相关,因为新的 AJAX 调用正在等待新的响应。

我的问题是,如果用户离开调用它的视图,我该如何阻止该操作继续进行?

阿贾克斯:

$.ajax({
    type: "get",
    url: "/Alert/GetWallboardAlerts",
    cache: false,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function (result) { ... }
});

控制器动作:

public ActionResult GetWallboardAlerts()
{
    //...do long running stuff
    //...still doing stuff when page reloaded or I navigate elsewhere
    return Json(alertString, JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 如果用户离开调用它的视图,操作将继续,但浏览器不会等待响应,因此当操作完成时,它将被释放。
  • 据我所知,你不能。至少没有一些我不推荐的花哨的线程编程。
  • 如果你想终止请求,你可以试试这个:stackoverflow.com/a/446626/433234
  • @jasonwarford 但这会杀死 ajax 请求,而不是会继续运行的 GetWallboardAlerts()。
  • 你可以把你的长动作放到一个新线程中,如果有新任务进来就中止它——像这样:stackoverflow.com/questions/4783865/…

标签: javascript ajax asp.net-mvc


【解决方案1】:

我不认为你可以。向服务器发出请求后,您可以关闭浏览器,但请求仍将被执行。

这只是一个想法:

1) 调用者发出 AJAX 请求并提供唯一值(可能是 guid)。

2) 处理页面重新加载事件和关闭事件,并使用相同的唯一键发送新的 AJAX 请求以请求取消。

3) 在服务器上执行的长流程任务应该检查一个表明该任务已被取消的标志。

您也可以将 WebSocket 用于这样的任务,以便服务器可以 ping 客户端(如“仍然存在”请求)。如果您使用的是 .NET,则可以使用 SignalR。

我希望它对您有所帮助,或者至少可以提供解决您问题的想法。

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多