System.ObjectDisposedException только происходит несколько раз, другие работают нормально - PullRequest
0 голосов
/ 27 апреля 2018

В моем приложении для отслеживания действий пользователей в веб-приложении я застрял в этой ошибке, которая возникает только при вводе неправильного пароля, и я не могу найти способ его решить.

Код прерывается после оператора _context.UsersActivity.Add(this); и только тогда, когда пользователь вводит неправильный пароль, и это добавляется только после того, как я переместил метод «SaveUserActivity» из контроллера в класс, прежде чем я записал его в контроллер и все работает нормально.

Любая помощь будет деликатной.

Код от моего контроллера:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            await SaveUserActivity(model);
            return RedirectToLocal("~/Users/Index");
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToAction(nameof(Lockout));
        }
        else
        {
            if (await IfUserExist(model))
                PasswordFailure(model);

            ModelState.AddModelError(string.Empty, "Log In Failure.");
            return View(model);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

private async Task SaveUserActivity(LoginViewModel model, [CallerMemberName] string callerName = "")
{
    string Action = null;
    var RegActivity = new UserActivity();

    switch (callerName)
        {
        case "Login":
            Action = "Log In";
            break;
        case "IfUserExist":
            Action = "Log In attempt from no exist user.";
            break;
        case "PasswordFailure":
            Action = "Log In attempt with wrong password.";
            break;
    }

    await RegActivity.SaveUserActivity(_context, _userManager, model.UserName, Action);
}

private async Task<bool> IfUserExist(LoginViewModel model)
{
    var LoginAttemp = await _userManager.FindByNameAsync(model.UserName);
    if (LoginAttemp == null)
    {
        ViewData["Page"] = new PageSettings("AccountControllerLoginPostInvalidUser");
        await SaveUserActivity(model);
        return false;
    }
    return true;
}

private async void PasswordFailure(LoginViewModel model)
{
    ViewData["Page"] = new PageSettings("AccountControllerLoginPostInvalidPass");
    await SaveUserActivity(model);
}

Код из моего класса, который сохраняет активность пользователей:

public async Task SaveUserActivity(SiteDbContext _context, UserManager<SiteUser> _userManager, string _UserName, string _Action)
{

    var user = await _userManager.FindByNameAsync(_UserName);
    var status = (user == null || _Action.Contains("password"));
    var roles = (status) ? null : await _userManager.GetRolesAsync(user);

    UserName = _UserName;
    Roles = (status) ? null : roles;
    TimeStamp = DateTime.Now;
    Action = _Action;
    Role = (status) ? null : TransformListOfRolesToString();

    _context.UsersActivity.Add(this);
    _context.SaveChanges();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...