Я создал FileResult : IHttpActionResult
возвращаемый тип webapi для своих вызовов API. FileResult загружает файл с другого URL-адреса, а затем возвращает поток клиенту.
Изначально в моем коде была инструкция using
, как показано ниже:
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)
{...}
}
Однако это периодически приводило к TaskCanceledException
. Я знаю, что если HttpClient удаляется до завершения асинхронного вызова, состояние задачи изменится на отмененное. Однако, поскольку я использую ожидание в: Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath))
, которое должно предотвратить удаление HttpClient в середине завершения задачи.
Почему эта задача отменяется? Это происходит не из-за тайм-аута, поскольку это происходит при самых маленьких запросах и не всегда происходит при больших запросах.
Когда я удалил оператор using
, код работал правильно:
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)
{...}
}
Есть идеи, почему использование вызвало проблему?