Asp.net MVC4操作仅在本地调试时触发

Asp.net MVC4操作仅在本地调试时触发,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-routing,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Routing,我有一个用于重置用户密码的操作: public class Password : Controller{ public ActionResult Reset(string id) { //... } } id实际上是当询问密码恢复用于哪个电子邮件地址时,用户提供的加密电子邮件地址 因此,如果我点击“忘记密码”链接,并提供电子邮件地址user@domain.com发送到用户电子邮件的结果url类似于: 这将路由到上面包含的密码控制器上的重置操作。 当我在本地调试应用程序时

我有一个用于重置用户密码的操作:

public class Password : Controller{
  public ActionResult Reset(string id)
  {
    //...
  }

}
id实际上是当询问密码恢复用于哪个电子邮件地址时,用户提供的加密电子邮件地址

因此,如果我点击“忘记密码”链接,并提供电子邮件地址user@domain.com发送到用户电子邮件的结果url类似于:

这将路由到上面包含的密码控制器上的重置操作。 当我在本地调试应用程序时,这工作正常。 这是而不是在我的测试服务器上工作;我要换成404

有趣的事实:

  • 如果我从url中删除Id 我被重定向到 使用正确的消息索引密码控制器的操作 如预期的“无效链接”
  • 如果在id(即:)中包含任何其他字符串,则按预期重定向;如1)所述
  • 所以这似乎与我传递的id的解剖结构有关。我尝试了url编码,但没有成功

    这是管理区域的路由定义:

    public override void RegisterArea(AreaRegistrationContext context)
    {
       context.MapRoute(
          "Admin_default",
          "Admin/{controller}/{action}/{id}",
           new { controller = "Login", action = "Index", id = UrlParameter.Optional }
       );
    }
    
    主要路线是默认路线


    有什么想法吗?

    我怀疑这是因为url的路径部分有
    +
    符号。您可以看一看,其中Scott Hanselman解释了尝试在路径部分传递此类特殊字符时将遇到的困难

    我只引述他的结论:

    经过所有这些努力,在请求路径中获得疯狂的东西,它是 值得一提的是,只需将这些值作为查询的一部分 字符串(还记得这篇文章开头的地方吗?), 更干净、更灵活、更安全

    因此,只需将其删除并使用以下url:

    http://www.myapp.com/admin/password/reset?id=euPdxABQEgE0JDuv6OHSLnk1QBYf73YseBUZwR9%2BMJA%3D
    

    注意,当URL在URL中传递参数作为查询字符串值时,URL是如何编码的。

    侧注:考虑加密时间戳+用户电子邮件,以便您可以终止链接。parameter@MikeSmithDev很好的建议,我目前没有终止链接,但我会按照你在这里的建议去做。@MillerKoijam是的,我发现在遵循公认的答案后,这也是必要的。谢谢酷,谢谢!我尝试重置?id=。。。它是有效的;但是,id的内容也必须进行URL编码。非常感谢!