MVC4 Action仅在本地调试时触发

时间:2014-02-10 16:53:16

标签: 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将是这样的:

  

http://www.myapp.com/admin/password/reset/euPdxABQEgE0JDuv6OHSLnk1QBYf73YseBUZwR9+MJA=

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

有趣的事实:

  1. 如果我从网址中删除了ID http://www.myapp.com/admin/password/reset/我被重定向到了 密码控制器的索引操作与正确的消息 “预期链接无效”。
  2. 我是否在id中包含任何其他字符串(即:http://www.myapp.com/admin/password/reset/abc123)我按预期重定向;如1)中所述。
  3. 所以看起来这与我正在传播的身份的解剖学有某种关系。我试过url编码但是没有用。

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

    public override void RegisterArea(AreaRegistrationContext context)
    {
       context.MapRoute(
          "Admin_default",
          "Admin/{controller}/{action}/{id}",
           new { controller = "Login", action = "Index", id = UrlParameter.Optional }
       );
    }
    

    主要路线是默认路线。

    有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我怀疑这是因为您网址路径部分中的+符号。您可以查看following blog post,其中Scott Hanselman通过尝试在路径部分中传递此类特殊字符来解释您将遇到的困难。

我只会引用他的结论:

  

在完成所有这些努力以获得请求路径中的疯狂内容之后,就是这样   值得一提的是,只需将值保留为Query的一部分   字符串(记得在这篇文章的开头回答?)更容易,   更清洁,更灵活,更安全。

所以只需删除它并使用以下网址:

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

注意我是如何对url编码的字符串,这是在将参数作为查询字符串值传递到url中时应该做的。