加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在动作之外执行异步操作asp.net mvc

发布时间:2020-12-16 03:34:28 所属栏目:asp.Net 来源:网络整理
导读:我希望能够在每个请求上从云数据库加载用户,并在使用asp.net mvc的控制器中根据请求提供该用户.问题是当前框架不支持从动作过滤器执行异步操作.所以OnActionExecuting,OnAuthorization方法不允许我这样做..例如我有以下代码不能工作(所以不要尝试)..你得到一
我希望能够在每个请求上从云数据库加载用户,并在使用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;
  }
}

那么有没有其他方法可以做到这一点?我注意到基础控制器中有一个begin execute方法:

protected override IAsyncResult BeginExecute(RequestContext requestContext,AsyncCallback callback,object state)
{
  return base.BeginExecute(requestContext,callback,state);
}

我可以在那里做吗?

解决方法

问题是三个月大,所以我猜你已经成功解决了这个问题.无论如何,我会在这里添加我的解决方案,因为我必须做类似的事情.

我使用了ParallelExtensionsExtras库中的一些方法.这是我的班级:

public class AsyncControllerBase : Controller
{
    protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext,object state)
    {
        return ExecuteCoreAsync(requestContext,state).ToAsync(callback,state);
    }

    protected override void EndExecute(IAsyncResult asyncResult)
    {
        IAsyncResult baseAsyncResult = ((Task<IAsyncResult>)asyncResult).Result;
        base.EndExecute(baseAsyncResult);
    }

    protected virtual async Task<IAsyncResult> ExecuteCoreAsync(System.Web.Routing.RequestContext requestContext,object state)
    {
        await DoStuffHereOrInDerivedClassAsync();

        var baseBeginExecuteCompletion = new TaskCompletionSource<IAsyncResult>();

        AsyncCallback callback = ar =>
        {
            baseBeginExecuteCompletion.SetResult(ar);
        };

        // OnActionExecuting will be called at this point
        var baseAsyncResult = base.BeginExecute(requestContext,state);

        await baseBeginExecuteCompletion.Task;

        return baseAsyncResult;
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读