我有一个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中可靠地工作异步。
我被阻止了,我会继续谷歌搜索解决方案。
答案 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的强制异步调用运行页面现在可以正常工作。