CancellationToken如何在引擎盖下工作?

时间:2018-02-07 22:04:44

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

是否还有另一个必须发出的http请求?

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

我是否需要对客户端进行编码以使其正常工作?

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

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

}

1 个答案:

答案 0 :(得分:1)

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