Desidero poter caricare un utente da un database cloud su ogni richiesta e avere quello disponibile sulla richiesta in un controller usando asp.net mvc. Il problema è che il framework corrente non supporta le operazioni asincrone dai filtri di azione. Quindi OnActionExecuting, i metodi OnAuthorization non mi permettono di fare questo .. per esempio ho il seguente codice che NON funziona (quindi non provarlo) .. Si ottiene un'eccezione: "Un modulo asincrono o un handler completati mentre un asincrono l'operazione era ancora in sospeso. "Esecuzione operazione Async asp.net mvc al di fuori dell'azione
protected async override void OnAuthorization(AuthorizationContext filterContext)
{
var user = filterContext.HttpContext.User;
if (!user.Identity.IsAuthenticated)
{
HandleUnauthorizedRequest(filterContext);
return;
}
using (var session = MvcApplication.DocumentStore.OpenAsyncSession())
{
User currentUser = await session.LoadAsync<User>(user.Identity.Name);
if (currentUser == null)
{
HandleUnauthorizedRequest(filterContext);
return;
}
filterContext.HttpContext.Items["User"] = currentUser;
}
}
Quindi c'è un altro modo di essere in grado di farlo? Noto che esiste un metodo di esecuzione iniziale nel controller di base:
protected override IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state)
{
return base.BeginExecute(requestContext, callback, state);
}
Posso farlo lì forse?
È possibile [votare per filtri azione asincrona qui] (https://aspnet.codeplex.com/workitem/9582). –
Ho recentemente [pubblicato una libreria] (https://www.nuget.org/packages/Hydrogen.Extensions.Mvc5.Async) che aggiunge il supporto adeguato per i filtri asincroni (basato pesantemente sul codice in entrata da [ASP.NET MVC core] (https://github.com/aspnet/Mvc)). L'origine è anche disponibile qui: https://github.com/jdaigle/Hydrogen.Extensions.Mvc5. –