繁体   English   中英

剃刀查看比赛条件

[英]Razor View 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引擎一次只能处理一个请求? 我怀疑是这样的。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM