Ho creato un tipo di reso webapi FileResult : IHttpActionResult
per le mie chiamate api. FileResult scarica un file da un altro url e quindi restituisce il flusso al client.HttpClient nell'utilizzo dell'istruzione causa Attività annullata
Inizialmente il mio codice ha avuto una dichiarazione using
come di seguito:
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)
{...}
}
Tuttavia, questo potrebbe causare un modo intermittente TaskCanceledException
. So che se HttpClient viene eliminato prima che la chiamata asincrona sia terminata, lo stato della Task cambierà in annullato. Tuttavia, poiché utilizzo uno , attendo in: Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath))
che dovrebbe impedire a HttpClient di essere eliminato al termine del completamento dell'attività.
Perché l'attività viene annullata? Non è a causa di un timeout poiché ciò è accaduto per le richieste più piccole e non si verifica sempre in caso di richieste di grandi dimensioni.
Quando ho tolto il using
comunicato il codice ha funzionato correttamente:
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)
{...}
}
Qualsiasi idea del perché l'uso ha causato il problema?
Hai provato a utilizzare un debugger? Controllandolo passo dopo passo. – kevintjuh93
Sì, ho. Non è di grande aiuto in quanto l'eccezione non viene lanciata qui, ma in una posizione completamente diversa. Si verifica nella pipeline Owin che sto usando dove è l'autenticazione e attende la prossima richiesta. – Rafi
Il 'TaskCanceledException' ha un'eccezione interna? –