Как работает CancellationToken?

Есть ли еще один http-запрос, который нужно отправить?

Как браузер уведомляет сервер о брошенном/отмененном запросе?

Нужно ли мне кодировать мою клиентскую часть, чтобы это работало?

Это мой метод контроллера ASP MVC:

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

}

person Dan    schedule 07.02.2018    source источник
comment
Можете ли вы привести простой пример кода? CancellationToken очень распространен, и точные детали реализации зависят от фактической функции, которую вы вызываете.   -  person Stefan    schedule 08.02.2018


Ответы (1)


  1. Браузеры могут отменять HTTP-запросы, закрыв основное TCP-соединение. HTTP.SYS и IIS обнаруживают это и передают уведомление о закрытии соединения коду приложения, например ASP.NET. В ASP.NET это отображается через свойство HttpResponse.IsClientConnected и другие места. См. этот QA: https://stackoverflow.com/questions/2652082/can-a-http-server-detect-that-a-client-has-cancelled-their-request
  2. Скрипты клиента веб-страницы не могут отменить «основной» запрос (пользователь вручную перемещается с помощью адресной строки или щелкает ссылку на странице) — только пользователи могут отменить это, нажав кнопку «Стоп». Ваш клиентский код может отменить запросы XMLHttpRequest (AJAX) и современные запросы fetch с помощью функции abort() (jQuery также предоставляет это в своем собственном возвращаемом объекте $.ajax).
  3. В этой статье объясняется, как использовать CancellationToken внутри асинхронных методов действия контроллера: https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/
  4. Entity Framework 6 имеет ограниченную поддержку асинхронных операций, в основном через ToListAsync для запросов и SaveChangesAsync для операций хранилища. Убедитесь, что вы используете правильные методы расширения: QueryableExtensions.ToListAsync не принимает CancellationToken, но DbRawSqlQuery.ToListAsync делает. Должно быть очевидно, что async несовместим с функцией отложенной загрузки EF, поэтому вам нужно предварительно загрузить все необходимые объекты в асинхронном коде, чтобы не вызвать отложенную загрузку. В любом случае я рекомендую отключать отложенную загрузку в большинстве случаев.
person Dai    schedule 07.02.2018