Imagine que estamos llamando a las API REST dentro de nuestra acción, todas ellas cambiando el estado de algo, y entre estas líneas, finaliza la conexión del cliente.
En la imagen, estamos cargando una gran cantidad de datos del almacenamiento para devolverlos como una transmisión (conozco una mala práctica), y dentro de esta línea termina la conexión.
Finalmente, con la imagen, devolvemos una transmisión con una película de 1 GB de nuestra acción que (la transmisión) maneja toda la lectura y devolución interna, y se pierde la conexión.
¿Lo que sucede?
¿Tendremos una excepción lanzada? ¿Tendremos todo el código ejecutado y el resultado enviado a dev/null?
Cuando finaliza la conexión del cliente, se invocará el token de cancelación asociado con la solicitud. Si toma un CancellationToken como argumento para su acción, puede usarlo para detectarlo y cancelar la acción de cualquier manera que considere apropiada para su caso de uso. De lo contrario, su acción continuará ejecutándose como si nada hubiera pasado.
Por lo general, la acción del controlador devuelve un objeto "Resultado" que sabe cómo manejar el envío de datos al cliente. En un escenario de transmisión, su resultado sería un objeto que transmite datos al cliente. Esto ocurre fuera del tiempo de vida de la acción del controlador (después de que la acción haya regresado). Si una conexión muere (ya sea con el cliente o desde la fuente) mientras el resultado de la transmisión está en curso, se genera una excepción. No recuerdo más detalles. Esperemos que alguien más pueda proporcionar una respuesta más completa.
Como describe @StriplingWarrior, dentro del método de acción de sus controladores, depende de verificar la propiedad IsCancellationRequested del CancellationToken pasado y decidir qué tipo de resultado devolver.
Cuando un cliente se desconecta mientras ya está escribiendo en el flujo de salida, se lanzará una OperationCanceledException . Esto ocurre fuera del controlador, dentro de una clase derivada de FileResult , por ejemplo, FileContentResult .
El código fuente de ASP.NET Core que maneja la transmisión/escritura de un archivo en el flujo de salida, se ocupa de esto al detectar esta excepción y anular la conexión.
Observe los comentarios en el código fuente original.
internal static async Task WriteFileAsync(HttpContext context, Stream fileStream, RangeItemHeaderValue? range, long rangeLength) { // ... using (fileStream) { try { // ... } catch (OperationCanceledException) { // Don't throw this exception, it's most likely caused by the client disconnecting. // However, if it was cancelled for any other reason we need to prevent empty responses. context.Abort(); } } }