【问题标题】:ASP.NET MVC3 app creating bad route valueASP.NET MVC3 应用程序创建错误的路由值
【发布时间】:2011-11-03 19:46:23
【问题描述】:

好的,这可能只是我无知,但我的 MVC3 应用程序中有以下路线:

routes.MapRoute("Directory","{aid}/{controller}/{action}/{year}/{quarter}",
     new { aid = "sf", controller = "Lobbyist", action = "Index", 
     year = CurrentYear(), quarter = CurrentQuarter() });

在我的 Global.asax.cs 中,我有这两种方法:

    public static int CurrentQuarter()
    {
        int quarter = 0;
        //...use some internal business logic to determine the value of 
        //'quarter' based on the current date...
        return quarter;
    }

    public static int CurrentYear()
    {
        return DateTime.Now.Year;
    }

这段代码几乎一直都很好用。在某个时间点,在我们的生产环境(运行 IIS7)中,CurrentQuarter() 的路由值变为零值,而它本应为 1、2、3 或 4。它在生产环境中工作得很好,除了那个时间点。 IISRESET“修复”了问题。

我知道的:

  1. CurrentQuarter() 失败时,CurrentYear() 仍在 正确返回
  2. CurrentQuarter() 方法未抛出 会阻止设置“季度”变量的异常
  3. 驱动 CurrentQuarter() 方法的业务逻辑有效 对于 DateTime.MinValue 和 DateTime.MaxValue 之间的每个日期

我的问题真正归结为:

  • 调用静态方法生成路由值是不是很糟糕?
  • 应用程序是否有可能“忘记”静态方法的结果并导致它返回垃圾值?应用程序池回收会导致这种情况吗?

我有点想抓住稻草了!

感谢您的建议。

【问题讨论】:

  • 答案是“否”和“否”。在新 MVC 项目的默认 Global.asax.cs 中,RegisterRoutes(您的 routes.MapRoute 是否在那里调用?)是在 Application_Start 上调用的静态方法。 CurrentQuarter 在此注册期间仅调用一次。仅当请求 url 中不存在季度 url 元素时,才使用提供的值。

标签: asp.net-mvc-3


【解决方案1】:

我不会在这里调用静态值。我完全不同意上面的伊戈尔。它不是标准的,并且很难追踪这些值来自不了解该应用程序的人的位置。从您的控制器调用它,或者甚至更好 - 您的控制器调用的服务层(即业务逻辑)获取此值。

路由的目的不是调用业务方法。

关于第二个问题,如果有应用程序池回收,则该值将简单地重置。但是,如果多个线程正在调用此方法并可能更改同一方法中的值,我将在那里实现一些锁定以防止更新重叠。

【讨论】:

  • 我明白您的观点,即对于不了解代码的开发人员来说,调试起来更加困难。我确实对您的上一条评论“实施一些锁定”有疑问。你的意思是像我上面的 CurrentYear() 方法这样的静态方法不是线程安全的吗?我会觉得这真的很令人震惊。我可以查看我是否设置了在方法之外声明的某个变量的值,否则...
【解决方案2】:

您应该将路线值设置为可选的年份和季度,并在 Action 方法中为它们提供默认值。我认为这会让一切变得更干净,更容易维护。

public class LobbyistController
{
   public ActionResult Index(int? year, int? quarter)
   {
     if (!currentYear.HasValue) 
     {
       currentYear = GetCurrentYear();
     }

     if (!currentQuarter.HasValue)
     {
       currentQuarter = GetCurrentQuarter();
     }

     // the rest
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    相关资源
    最近更新 更多