剃刀查看比赛条件

时间:2012-06-04 20:33:16

标签: c# asp.net-mvc multithreading razor race-condition

在一个源自RazorViewEngine的自定义剃刀引擎中,我发现了我认为不稳定的代码:

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        ViewLocationFormats = AddViewDynamicFormat(controllerContext, viewName).ToArray();
        AreaViewLocationFormats = AddAreaViewDynamicFormat(controllerContext, viewName).ToArray();
        return base.FindView(controllerContext, viewName, masterName, useCache);
    }

我担心的是,当“同时”处理两个请求时,第一个将根据需要设置位置格式,但在它可以使用之前 - 第二个线程请求可能有机会设置位置格式化不同的方式。其余的都很难看。

这是一个有效的问题吗?换句话说,ASP.NET MVC是否保证Razor View引擎一次只能处理一个请求?我怀疑是这样的。

同样,如果每个请求都有一个剃刀视图引擎对象,那么这样就可以了。但我也不相信是这样的。

更新 我已经确认这是一场竞争条件。我还发现了一篇显示dynamic expansive razor search example的文章,该文章解决了没有竞争条件的问题(尽管我仍然怀疑它是否存在缓存问题)。

2 个答案:

答案 0 :(得分:0)

ViewLocationFormatsAreaViewLocationFormats是虚拟的吗?如果是这样,您可以将该值放在HttpContext.Current.Items集合中,并从重写的属性中检索它。

答案 1 :(得分:0)

我几乎肯定RazorViewEngine不是要在运行时修改,而只是在Global.asax Application_Start中配置。我相信RazorViewEngine实例在启动后的应用程序域的生命周期中存在。

如果您需要添加其他ViewLocationFormats或AreaViewLocationFormats,请在Application_Start中执行此操作。保证Application_Start每个App Domain只运行一次。