HttpClient en utilisant l'instruction des causes de la Tâche annulée
J'ai créé un FileResult : IHttpActionResult
webapi type de retour pour mes appels de l'api. Le FileResult télécharge un fichier à partir d'une autre url et renvoie ensuite le flux de données vers le client.
Au départ, mon code a un using
déclaration comme ci-dessous:
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)
{...}
}
Cependant, ce serait provoquer par intermittence un TaskCanceledException
. Je sais que si le HttpClient est disposé avant le asychronous appel est fini de l'état de la Tâche va changer pour annulée. Cependant depuis que j'utilise un attendent: Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath))
qui devraient empêcher le HttpClient d'être éliminés au moyen de l'achèvement de la tâche.
Pourquoi est-ce que la tâche d'obtenir annulé? Il n'est pas en raison d'un délai d'attente depuis ce qui s'est passé sur le plus petit des demandes et de ne pas toujours se produire sur de grandes demandes.
Quand j'ai enlevé le using
déclaration, le code a fonctionné correctement:
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)
{...}
}
Aucune idée de la raison de l'utilisation de la cause du problème?
Oui, j'ai. Cela n'aide pas vraiment étant donné que l'exception n'est pas jeté ici, mais dans un tout autre endroit. Il se produit dans le Owin pipeline, je suis à l'aide de l'authentification et il attend la prochaine demande.
Le
TaskCanceledException
ont aucune exception interne?Il n'y a pas d'exception interne.
OriginalL'auteur Rafi | 2015-10-13
Vous devez vous connecter pour publier un commentaire.
Mais qu'est-ce que la tâche faire? Il obtient le flux. Ainsi, votre code se termine par une
Stream
qui peut ou peut ne pas être entièrement lu quand il ferme laHttpClient
.HttpClient
est spécialement conçu pour les réutiliser (et l'utilisation simultanée), donc je vous recommande de retirer leusing
complètement et le déplacement de laHttpClient
déclaration à unstatic
membre de la classe. Mais si vous voulez fermer et de rouvrir les clients, vous devriez être en mesure d'obtenir ce travail par lecture le flux entièrement dans la mémoire avant la fermeture de laHttpClient
.OriginalL'auteur Stephen Cleary
J'ai eu un problème similaire avec la Tâche Annulée exceptions. Si vous essayez d'attraper
AggregateException
ou d'avoir un fourre-toutException
bloc en dessous de votreWebException
, vous découvrirez peut-être que vous l'attraper, à une exception près, avec l'entrée en déclarant "Une tâche a été annulée"J'ai fait quelques recherches et trouvé que la
AggregateException
est tout à fait trompeur, comme décrit dans les différents threads;Réglage HttpClient pour un trop court délai accidents de processus
Comment puis-je savoir quand HttpClient a expiré?
Bug dans httpclientgetasync devriez jeter webexception pas taskcanceledexception
J'ai fini par changer mon code pour définir explicitement un délai d'attente (où
asyncTimeoutInMins
est lu à partir de l'app.fichier de config);OriginalL'auteur Mr Moose