【问题标题】:How does CancellationToken work under the hood?CancellationToken 如何在幕后工作?
【发布时间】:2018-02-07 22:04:44
【问题描述】:

是否需要发出另一个 http 请求?

浏览器如何通知服务器放弃/取消请求?

我是否需要编写客户端代码才能让它工作?

这是我的 ASP MVC 控制器方法:

[HttpGet("/get")]
public async Task<string> Get(CancellationToken cancellationToken)
{
   //propagate CancellationToken to Entity Framework

}

【问题讨论】:

  • 你能提供一个简单的代码示例吗? CancellationToken 很常见,具体的实现细节取决于你调用的实际函数。

标签: asp.net-mvc http cancellation-token


【解决方案1】:
  1. 浏览器可以通过关闭底层 TCP 连接来取消 HTTP 请求。 HTTP.SYS 和 IIS 检测到这一点并将连接关闭通知传递给应用程序代码,例如 ASP.NET。在 ASP.NET 中,这是通过 HttpResponse.IsClientConnected 属性和其他地方公开的。请参阅此 QA:Can a http server detect that a client has cancelled their request?
  2. 网页客户端脚本无法取消“主”请求(用户通过使用地址栏手动导航或单击页面中的链接) - 只有用户可以通过按下停止按钮取消该请求。您的客户端代码可以使用 abort() 函数取消 XMLHttpRequest (AJAX) 和现代 fetch 请求(jQuery 也在他们自己的 $.ajax 返回对象中公开了这一点)。
  3. 这篇文章解释了如何在异步控制器Action方法中使用CancellationTokenhttps://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/
  4. Entity Framework 6 对异步操作的支持有限,主要通过ToListAsync 进行查询和SaveChangesAsync 进行存储操作。确保您使用了正确的扩展方法:QueryableExtensions.ToListAsync does not 接受 CancellationTokenDbRawSqlQuery.ToListAsync doesasync 显然与 EF 的延迟加载功能不兼容,因此您需要在异步代码中抢先加载所有需要的实体,这样就不会调用延迟加载。无论如何,我建议在大多数情况下禁用延迟加载。

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 2011-02-17
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多