1

解析ライブラリを使用してユーザーを認証したいのですが。

api呼び出しは非同期呼び出しのみをサポートするため、これをasycにしたいメソッドを次に示します。私は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");
}
4

2 に答える 2

4

ブログで説明しているため、デッドロック状態が発生してResultいます。

残念ながら、メンバーシッププロバイダーは(まだ)async認識していません。したがって、メソッドConfigureAwait(false)のどこでも使用してみてください。async

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

(他のasync方法でも同じです)。

于 2013-03-25T12:57:17.107 に答える
3

解決策は

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

だから基本的に私は非同期メソッド呼び出しの周りに同期ラッパーを持っています。記事から、Parseライブラリのその関数がawaitまたはconfigureawait(false)をどのように使用しているかにも依存することがわかりました。

于 2013-03-28T09:35:38.163 に答える