route mvc fromuri c# asp.net-mvc asp.net-web-api async-await cancellation-token

mvc - web api en c#



¿Deberíamos utilizar CancellationToken con controladores MVC/Web API? (3)

Hay diferentes ejemplos para controladores asíncronos. Algunos de ellos usan CancellationToken en la definición del método:

public async Task<ActionResult> ShowItem(int id, CancellationToken cancellationToken) { await Database.GetItem(id, cancellationToken); ...

Pero otros ejemplos e incluso los proyectos predeterminados de ASP.NET para VS2013 no usan CancellationToken en absoluto y funcionan sin él:

public async Task<ActionResult> ShowItem(int id) { await Database.GetItem(id); ...

No está claro si deberíamos utilizar CancellationToken en controladores o no (y por qué).


Deberías usarlo En este momento, solo se aplica si tiene un AsyncTimeout , pero es probable que una futura versión de MVC / WebAPI interprete el token como "tiempo de espera o cliente desconectado".


Los usuarios pueden cancelar solicitudes a su aplicación web en cualquier momento, presionando el botón de detener o volver a cargar en su navegador. Por lo general, tu aplicación seguirá generando una respuesta de todos modos, aunque Kestrel no la envíe al usuario. Si tiene un método de acción de ejecución larga, es posible que desee detectar cuándo se cancela una solicitud y detener la ejecución.

Puede hacerlo inyectando un CancellationToken en su método de acción, que se vinculará automáticamente al token HttpContext.RequestAborted para la solicitud. Puede marcar este token para la cancelación como de costumbre, y pasarlo a cualquier método asincrónico que lo soporte. Si la solicitud se cancela, se lanzará una OperationCanceledException o TaskCanceledException.

El siguiente enlace explica este escenario en detalle.

https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/


Podrías usar esto

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken) { CancellationToken disconnectedToken = Response.ClientDisconnectedToken; using (var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken)) { IEnumerable<ReportItem> items; using (ApplicationDbContext context = new ApplicationDbContext()) { items = await context.ReportItems.ToArrayAsync(source.Token); } return View(items); } }

tomado de here .