【问题标题】:Can I cancel a controller request half way in ASP MVC?我可以在 ASP MVC 中中途取消控制器请求吗?
【发布时间】:2015-07-21 08:38:58
【问题描述】:

我对 ASP MVC 很陌生

我有一个用户可以选择的菜单选项列表。根据 MVC 架构,每个菜单选择都会触发一个控制器。

但不幸的是,其中一些控制器需要一些时间来执行才能做出可见的更改。因为大数据需要绑定到网格。所以浏览器一直挂起(显示加载)。

如果用户在一个耗时的菜单选项之后选择了一个可以轻松加载的选项,则会发生最坏的情况。

如果另一个控制器动作请求进来,有人可以帮忙解决一个控制器动作请求吗? 现在它是所有用户选择的操作的总和

例如:如果用户选择 Menu1 ,然后选择 Menu2 。我的 Menu1 控制器操作需要一些时间才能执行。到那时,用户单击第一次单击时很容易加载的 Menu2。但是由于 Menu2 被点击,用户必须等待很长时间。

【问题讨论】:

  • 你应该使用ajax来做请求,时间过长,中止ajax请求。服务器端仍然会完成请求。即使您使用 Ajax,在 Action 中使用耗时的过程也会锁定用户打开另一个 Action,这是因为同一会话一次被锁定到一个请求中。我的建议是禁用 ASP.NET 会话并实现您自己的会话
  • 我可以在 ASP.Net 会话中有多个请求

标签: asp.net-mvc-3


【解决方案1】:

这有点老了,但我还是会尝试回答,因为我最近遇到了这个问题。如果您使用的是 MVC 5,则可以为您取消其他请求。诀窍是使用异步控制器操作并添加 CancellationToken 参数。

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
    List<ReportItem> items;
    using (ApplicationDbContext context = new ApplicationDbContext())
    {
        items = await context.ReportItems.ToListAsync(cancellationToken);
    }
    return View(items);
}

当用户导航到另一个页面时,请求被取消。 MVC 将向取消令牌发出请求已被取消的信号。只要你也像我上面那样将取消令牌传递给异步数据访问方法,查询将被取消,服务器将立即停止处理请求。

我在这里整理了完整的解释:http://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspx

【讨论】:

  • 有没有办法在 asp. Net mvc4 与 .net4?
  • 当用户发送更具体的请求时,如何从客户端触发取消而不仅仅是导航?
  • @ChrisHayes 在这种情况下,您可以通过对每个单独的请求调用 abort 方法来取消请求。 developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort
  • @DavidPaquette 问题“asp.net-mvc3”上有一个标签。所以我猜你的回答不适用。
  • 我可以在 Asp.NET Web 表单中执行此操作吗? ,你能回答this的问题吗?我正在尝试取消没有async 的请求。使用async 可以并发请求吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 2011-12-30
  • 2011-04-27
  • 2013-11-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多