在动作之外执行异步操作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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – ApiController中的ASP.NET Web API路由
- 使用ASP.Net webforms和MVC进行Ninject
- asp.net-mvc – MVC DropDownList SelectedValue不正确显示
- asp.net – 如何使用SqlDependency使OutputCache依赖于每个
- asp.net – Gridview在列标题中排序/向下箭头
- asp.net-mvc-3 – 使用connectionStringName进行数据库日志
- 从ASP.NET MVC 2中排除授权操作
- asp.net – 是否可以在.net中读取.eml文件
- asp.net mvc webapi 实用的接口加密方法
- 使用StateServer的ASP.NET会话混合(SCARY!)
推荐文章
站长推荐
- asp.net-mvc – StringLength / Minlength验证不
- asp.net-web-api – 尝试从asp.net web api自主主
- asp.net – 使CustomValidator与ValidationSumma
- asp-classic – 如何在经典ASP中使用VBScript生成
- asp.net – log4net没有记录ThreadContext
- asp.net-core-mvc – 如何创建从HttpContext.Tra
- asp.net-mvc-3 – asp.net mvc 3验证摘要不显示通
- asp.net-mvc – MVC – 如何从get请求获取参数值
- asp.net – 使用CRC的较短GUID
- asp.net – App_Data / ASPNETDB.MDF到Sql Serve
热点阅读