【发布时间】:2021-09-25 01:34:43
【问题描述】:
我希望能够在每个请求上从云数据库加载用户,并使用 asp.net mvc 在控制器中的请求上提供该用户。问题是当前框架不支持从操作过滤器执行异步操作。所以 OnActionExecuting,OnAuthorization 方法不允许我这样做..例如,我有以下代码不起作用(所以不要尝试)..你得到一个异常:“异步模块或处理程序在异步时完成操作仍在等待中。”
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;
}
}
那么还有其他方法可以做到这一点吗?我注意到基础控制器中有一个开始执行方法:
protected override IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state)
{
return base.BeginExecute(requestContext, callback, state);
}
我可以在那里做吗?
【问题讨论】:
-
我最近 published a library 添加了对异步过滤器的适当支持(主要基于来自 ASP.NET MVC Core 的代码)。来源也在这里:github.com/jdaigle/Hydrogen.Extensions.Mvc5.
标签: asp.net asp.net-mvc asynchronous ravendb