ASP.控制器没有捕获自定义Identity UserStore类中抛出的异常

本文关键字:异常 UserStore Identity 控制器 自定义 ASP | 更新日期: 2023-09-27 18:13:11

我正在尝试在我的ASP中实现更改电子邮件功能。. NET MVC项目。我的应用程序的性质要求每个用户的电子邮件地址都是唯一的。在我的ASP中。我创建了自定义SetEmailAsync()方法,当电子邮件地址已经在使用时抛出ArgumentException。实现如下所示:

class IdentityUserStore
{
    // Unrelated methods omitted for simplicity
    public Task SetEmailAsync(ApplicationUser User, string email)
    {
        var user = UnitOfWork.Users.FindByEmail(email);
        CheckExistingUser(user);
        user.Email = email;
        return Task.FromResult(0);
    }
    private void CheckExistingUser(User user){
        if (user != null)
        {
            throw new ArgumentException("The Email Address is already in use.");
        }    
    }
}
class AccountController : Controller
{
    // Unrelated Methods omitted for simplicity
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Email(ChangeEmailFormModel model)
    {
        ViewBag.ReturnUrl = Url.Action("Email");
        if (ModelState.IsValid)
        {
            try
            {
                var result = await userManager.SetEmailAsync(User.Identity.GetUserId(), model.NewEmail);
                if (result.Succeeded)
                {
                    return RedirectToAction("Email", new { Message = ManageMessageId.ChangeEmailSuccess });
                }
                else
                {
                    result.Errors.Each(error => ModelState.AddModelError("", error));
                }
            }
            catch(ArgumentException ae)
            {
                ModelState.AddModelError("", ae.Message);
            }
        }
        return View();
    }
}
如你所见,IdentityUserStore是UserStore的一个自定义实现。NET Identity,其中包括更改/设置电子邮件地址的功能。如果电子邮件地址已经被一个现有的User实体使用,这个类将抛出一个ArgumentException。这个异常应该在AccountController类的方法Email()中被捕获,但是它没有被捕获。相反,它会抛出以下错误消息:
An exception of type 'System.ArgumentException' occurred in MVCApp.Application.dll but was not handled in user code
Additional information: The Email Address is already in use.

所以我完全困惑了,我认为如果抛出异常,客户端代码应该能够捕获并处理它。但是这不会发生,由UserStore抛出的异常不会被控制器方法捕获。为什么会发生这种情况?它是否与'await'语句有关?有人能帮忙吗?

ASP.控制器没有捕获自定义Identity UserStore类中抛出的异常

Identity框架为您提供了一个强制电子邮件唯一性的选项。这是在UserValidator<>类中完成的,它是UserManager的一部分:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    //.. other code
    this.UserValidator = new UserValidator<ApplicationUser>(this)
    {
        RequireUniqueEmail = true,
    };
}

这将防止重复的电子邮件设置。而且不需要自己构建。