更改用户角色

时间:2015-03-18 21:58:40

标签: c# asp.net asynchronous

我有一个asp,我有单选按钮为用户选择一个角色。在aspx中,我想更改用户删除旧的角色并添加新角色,这很简单。

问题是我获得的ApplicationUserManager具有所有异步方法。异步和asp页面不能很好地给出错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =" true" %取代。此异常也可能表示尝试调用" async void"方法,在ASP.NET请求处理中通常不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。

对于发出此错误的异步尝试,我称之为异步任务。

    protected async void GrantPrivlege_Click(object sender, EventArgs e)
    {
        ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        string groupId = AspHelper.StringGuid(Request.Url.Segments[3]);
        string userId = Request.Url.Segments[4];
        IList<string> roles = await  WaitGetRoles(userId);
        foreach (string roleStr in roles) {
            await WaitRemoveFromRole(userId, roleStr);
        }
        ApplicationUser.RoleEnum role = (ApplicationUser.RoleEnum)Enum.Parse(typeof(ApplicationUser.RoleEnum), PrivilegeList.SelectedValue, true);
        await WaitAddToRole(userId, role.ToString());      
        Response.Redirect("/Admin/GroupAdmin/" + groupId);
    }

    protected async Task<IList<string>> WaitGetRoles(string userId)
    {
        ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        IList<string> roles = await manager.GetRolesAsync(userId);
        return roles;
    }

    protected async Task<bool> WaitRemoveFromRole(string userId, string roleStr)
    {
        ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        await manager.RemoveFromRoleAsync(userId, roleStr);
        return true;
    }

    protected async Task<bool> WaitAddToRole(string userId, string roleStr)
    {
        ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        await manager.AddToRoleAsync(userId, roleStr); 
        return true;     
    }

真正的谜题形式是Visual Studio项目附带的Admin Register页面,AddRole方法没有异步调用。

注册页面和我的页面都是一个带有aspx.cs的aspx,用

创建管理
ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();

并且都在onclick方法中执行。我真的希望我使用具有AddToRoles的UserManagerExtensions而不是使用带有所有异步的Microsoft.AspNet.Identity管理来获取Register ApplicationUserManager。差异可能是在Register asp没有登录时登录。

有人请告诉我如何获取UserManagerExtensions版本的ApplicationUserManager,或者如果不可能如何在aspx中可靠地工作异步。

我被阻止了,我会继续谷歌搜索解决方案。

1 个答案:

答案 0 :(得分:0)

有趣的是,发布此问题给了我一些新的Google术语,我发现http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx显示了如何在ASP.Net中执行异步aspx。

异步是真的,页面标记很酷,因为Visual Studio在我的所有调用中添加了一个异步标记,并且神奇地等待异步调用正常工作。

// I added Async="true" to my aspx page
<%@ Page Async="true"  Title="Async" Language="C#" CodeBehind="Async.aspx.cs" Inherits="Whatever"  %>

// and then in my aspx.cs file await GetRolesAsync() works now
    public async Task LoadPage()
    {
        string userId = Request.Url.Segments[4];
        ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        IList<string> roles = await manager.GetRolesAsync(userId);
        if (roles.Count > 0) {
            PrivilegeList.SelectedValue = roles[0];
        }                   
    }

使用来自ApplicationUserManager的强制异步调用运行页面现在可以正常工作。