ASP.NET Core点击重置密码邮件链接出现HTTP ERROR 405问题排查
HTTP ERROR 405表示请求的HTTP方法不被允许,你的问题核心是邮件链接的路径与控制器路由不匹配,导致GET请求找不到对应的处理方法。
具体问题点
路由冲突与不匹配
你的AccountController中的ResetPasswordGET方法使用了属性路由[Route("ResetPassword")],这意味着该方法的访问路径是/ResetPassword/{id}(而非邮件链接中的/Account/ResetPassword/{id})。当用户点击邮件里的/Account/ResetPassword/xxx链接时,系统会尝试通过默认路由匹配Account控制器的ResetPassword动作,但该动作被属性路由覆盖,导致找不到对应的GET处理方法,从而返回405错误。属性路由缺少参数占位符
即使你想使用属性路由,当前的[Route("ResetPassword")]也没有包含id参数的占位符,正确的写法应该是[Route("ResetPassword/{id}")],否则无法匹配带激活码的链接路径。潜在拼写问题(非405直接原因)
邮件模板中使用的是@Model.ActivCode,而ViewModel里的属性是ActiveCode,如果你的Model属性实际是ActiveCode,这里会导致激活码无法正确传入链接,需要检查拼写一致性。
解决方案
你可以选择以下两种方案之一:
方案1:使用默认路由(移除属性路由)
删除两个ResetPassword方法上的[Route("ResetPassword")]属性,让控制器走默认路由配置。此时AccountController的ResetPassword GET方法会自动匹配路径/Account/ResetPassword/{id},与邮件链接完全一致。
修改后的控制器代码:
public ActionResult ResetPassword(string id) { return View(new ResetPasswordViewModel() { ActiveCode = id }); } [HttpPost] public ActionResult ResetPassword(ResetPasswordViewModel reset) { // 原有逻辑不变 }
方案2:修正属性路由
在AccountController上添加控制器级别的属性路由,同时修正动作路由的参数占位符:
[Route("[controller]")] public class AccountController : Controller { [Route("ResetPassword/{id}")] public ActionResult ResetPassword(string id) { return View(new ResetPasswordViewModel() { ActiveCode = id }); } [HttpPost] [Route("ResetPassword")] public ActionResult ResetPassword(ResetPasswordViewModel reset) { // 原有逻辑不变 } }
这样配置后,GET方法的路由为/Account/ResetPassword/{id},与邮件链接匹配;POST方法的路由为/Account/ResetPassword,也能和表单的asp-action="ResetPassword"正确对应。
内容的提问来源于stack exchange,提问作者fateme zre

