【问题标题】:ConfirmEmail Action method returns 404ConfirmEmail Action 方法返回 404
【发布时间】:2020-06-27 13:46:52
【问题描述】:

我正在开发 asp.net mvc 应用程序,我面临的问题是,当用户单击其电子邮件中的确认您的帐户链接时,操作方法“Account/ConfirmEmail”采用两个参数字符串 userId 和 string代码未命中,我得到一个 404“找不到资源”。

网址: http://company2.chamferedcube.local:64255/Account/ConfirmEmail?**userId**=7da7d8f5-2fb7-47b2-82fd-59e0fba81ffd&**code**=vJIT0%2BeNr9aQ5WU2q6d5vvJEYgfreq2u5l4b3M0OqoZBOQVrMBf9jxMVssaPu6PU71MIj2ufVNSq32LxxXDswJ%2BK%2B1GrD8A%2BLwsswlKYM72F4XIN0LC7PoBd5Xa0fXCz88wgnHKqxztpOlDZ7Bm%2FZjCdTx5KPJ64pLLgbcZBcQUyo70vV%2FW6hKELSz5NnPGS

我怀疑字符串参数中有一些东西阻止了应用程序找出路由。

public async Task<ActionResult> ConfirmEmail(string userId, string code)
    {
        if (userId == null || code == null)
        {
            return View("Error");
        }
        var result = await UserManager.ConfirmEmailAsync(userId, code);
        return View(result.Succeeded ? "ConfirmEmail" : "Error");
    }

我尝试过但没有任何运气的是定义路线并将属性分配给相同的操作方法。

 routes.MapRoute(
           name: "emailConfirmation",
           url: "{controller}/{action}/{userId}/{code}",
           defaults: new { controller = "Account", action = "ConfirmEmail", userId = "", code="" },
           namespaces: new string[] { "SaaS.Controllers" }
       );

和属性

 [Route("emailConfirmation")]
    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string userId, string code)
    {
     
    }

如果我删除 userId 和 code 参数,则该操作会被两个空字符串命中。有什么想法吗? 谢谢

【问题讨论】:

  • 您希望它如何工作?您已经定义了匹配ConfirmEmail/{userId}/{code} 的路由,同时您正在调用confirmEmail?userId={userId}&amp;code={code}
  • 感谢您的回复,如果没有属性路由,它应该点击 confirmEmail?userId=54trtydy&code=gfhgjg ,但它没有?

标签: c# asp.net-mvc-5.2


【解决方案1】:

您在查询中将路由映射为 GET 参数,但在控制器方法中它们位于 URL 内。

除此之外,在示例中提供了 ** 包裹 URL 变量的情况。如果您要使用 GET 参数,则应该只发送名称。

尝试这样的查询: http://company2.chamferedcube.local:64255/Account/ConfirmEmail/7da7d8f5-2fb7-47b2-82fd-59e0fba81ffd/vJIT0%2BeNr9aQ5WU2q6d5vvJEYgfreq2u5l4b3M0OqoZBOQVrMBf9jxMVssaPu6PU71MIj2ufVNSq32LxxXDswJ%2BK%2B1GrD8A%2BLwsswlKYM72F4XIN0LC7PoBd5Xa0fXCz88wgnHKqxztpOlDZ7Bm%2FZjCdTx5KPJ64pLLgbcZBcQUyo70vV%2FW6hKELSz5NnPGS

您现在可以看到它是 /useridvalue/confirmcodevalue 而不是 GET 参数。问号被删除,变量名消失了,没有问号。这就是您将路线映射到的方式: url: "{controller}/{action}/{userId}/{code}",

编辑: 在这种情况下,您可能可以使用Request.QueryString["userId"];Request.QueryString["code"]; 直接获取值。我更熟悉 ASP.NET Core,其中查询字符串参数自动映射到方法参数。您还必须删除路由映射。

【讨论】:

  • URL 是从 void sendMail(IdentityMessage message) {} 自动生成的,因此链接包含 ?userId=&code=,我无法手动更改。至于** url 没有它们,我认为它们是在我在文本编辑器中将字体设置为粗体时出现的。
  • HTTP 错误 404.11 - 未找到 请求过滤模块被配置为拒绝包含双转义序列的请求。
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 2017-08-26
  • 2013-05-08
  • 2016-06-23
  • 2020-02-05
  • 2016-09-12
  • 2015-07-31
  • 2017-07-29
相关资源
最近更新 更多