如何使用async await功能与MVC / Membershipprovider

时间:2013-03-25 10:44:49

标签: asp.net-mvc parsing asp.net-membership asp.net-4.5

我想使用Parse Library验证用户。

以下是我希望将其设为asyc的方法,因为api call仅支持异步调用。我是MVC和aysc / await功能的新手。 现在的问题是它进入await方法并且永远不会返回结果并且视图无法加载。

我花了很多时间了解并试图使用不同的选项,但还没有成功。

我是否需要使用Partialviews,或者可以在ValidateUser方法中执行某些操作。 任何示例代码都非常感谢。 谢谢。

AccountController.cs

  public ActionResult Login(LoginModel model, string returnUrl)
    {

             if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
                {
                    var loggedIn = true;
                }
        return  View(model);
    }

ParseMembershipProvider:ExtendedMembershipProvider

public override bool ValidateUser(string username, string password)
    {

        var pUserRepo = new PUserRepository();
        bool flag = false;
        var requiredUser = pUserRepo.GetUserObjByUserName(username, password );


        if (requiredUser.Result != null)
            flag = true;

        return flag;

    }

PUserRepository.cs

 public async  Task<ParseUser> GetUserObjByUserName(string userName, string passWord)
{
    return await ParseUser.LogInAsync("test1", "test123");
}

2 个答案:

答案 0 :(得分:4)

由于Result I explain on my blog,您看到了死锁情况。

不幸的是,会员提供商还没有({1}}知道。因此,请尝试在async方法中使用ConfigureAwait(false)

async

(与您拥有的任何其他public async Task<ParseUser> GetUserObjByUserName(string userName, string passWord) { return await ParseUser.LogInAsync("test1", "test123").ConfigureAwait(false); } 方法相同)。

答案 1 :(得分:3)

解决方案

return Task.Run(() => ParseUser.LogInAsync(userName, passWord)).Result;

所以基本上我有围绕异步方法调用的同步包装器。我从article了解到,它还取决于Parse库中的函数如何使用await或configureawait(false)。