HttpClient al usar la declaración hace que la tarea se cancele
Creé unFileResult : IHttpActionResult
Webapi tipo de retorno para mis llamadas API. FileResult descarga un archivo de otra url y luego devuelve la transmisión al cliente.
Inicialmente mi código tenía unusing
declaración como a continuación:
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
using (var httpClient = new HttpClient())
{
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
}
return response;
}
catch (WebException exception)
{...}
}
Sin embargo, esto ocasionaría intermitentementeTaskCanceledException
. Sé que si el HttpClient se elimina antes de que finalice la llamada astronómica, el estado de la tarea cambiará a cancelado. Sin embargo, ya que uso unesperar en:Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath))
eso debería evitar que el HttpClient se elimine en la mitad de la finalización de la tarea.
¿Por qué se cancela esa tarea? No se debe a un tiempo de espera ya que esto ha sucedido en las solicitudes más pequeñas y no siempre ocurre en solicitudes grandes.
Cuando quité elusing
declaración el código funcionó correctamente:
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
var httpClient = new HttpClient();
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
return response;
}
catch (WebException exception)
{...}
}
¿Alguna idea de por qué el uso causó el problema?