在从 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 视图引擎对象,那么就可以了。但我也不相信是这样的。
更新 我已经确认这是一个竞争条件。我还发现一篇文章显示了一个动态扩展剃刀搜索示例,它在没有竞争条件的情况下解决了问题(尽管我仍然想知道它是否有缓存问题)。