4

在从 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 引擎一次只处理一个请求?我怀疑情况是否如此。

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

更新 我已经确认这是一个竞争条件。我还发现一篇文章显示了一个动态扩展剃刀搜索示例,它在没有竞争条件的情况下解决了问题(尽管我仍然想知道它是否有缓存问题)。

4

2 回答 2

0

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

于 2012-06-04T21:33:19.373 回答
0

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

如果您需要添加额外的 ViewLocationFormats 或 AreaViewLocationFormats,请在 Application_Start 中进行。Application_Start 保证每个应用程序域仅运行一次。

于 2012-06-04T21:46:05.390 回答