在从 RazorViewEngine 派生的自定义 Razor 引擎中,我发现了我认为不稳定的代码:

    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 View 引擎对象,那么就可以了。但我也不相信是这样。

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

最佳答案

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

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

关于c# - Razor View 竞争条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10887959/

10-09 10:21