Mi rendo conto che attendere attende per un'attività (attendibile) da completare. Ma sono confuso su cosa significhi in realtà.Async WebApi ActionFilterAttribute. Un modulo o gestore asincrono è stato completato mentre era ancora in attesa un'operazione asincrona
Il codice che non lo fa lavoro:
public async override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response.Content != null)
{
var responseContent = await actionExecutedContext.Response.Content.ReadAsStringAsync();
DoSomething(responseContent);
}
}
Il codice che fa lavoro:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response.Content != null)
{
var responseContent = actionExecutedContext.Response.Content.ReadAsStringAsync().ContinueWith(
task =>
{
DoSomething(task.Result);
});
}
}
Ovviamente il messaggio di errore Un modulo asincrono o gestore completato mentre un'operazione asincrona era ancora in sospeso. mi dice che non era in attesa che la chiamata asincrona si completasse, ma invece il thread "principale" continuava. Mi aspettavo che il thread continuasse ma non all'interno del metodo corrente. Pensavo che il thread sarebbe tornato nello stack di asp.net fare qualche altro lavoro e tornare una volta che l'operazione asyncOperation() è stata completata.
Sto usando attendere anche in altri luoghi - (ad esempio, in attesa di risposte al servizio Web) - e non ho riscontrato problemi simili ovunque. Mi chiedo perché IActionFilterAttribute si comporta in modo diverso. In effetti, le chiamate sul servizio web probabilmente richiedono più tempo rispetto alla lettura del contenuto della risposta in una stringa.
Qualcuno può per favore illuminarmi? Ho la sensazione di non aver capito il concetto.
I filtri di azione (parte di MVC, non WebAPI) non supportano le operazioni asincrone. Se hai bisogno di un filtro di azione asincrono, prova invece a utilizzare un gestore di messaggi. Oh, e [vota qui] (http://aspnet.codeplex.com/workitem/9582). –
Questa è una domanda WebAPI e sto usando il giusto ActionFilterAttribute (System.Web.Http ...) - stai dicendo che dovrebbe funzionare? :) – lapsus
Capisco. In tal caso, sarà probabilmente necessario definire il proprio 'AsyncActionFilterAttribute' e implementare' IActionFilter.ExecuteActionFilterAsync'. –