在一个源自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的文章,该文章解决了没有竞争条件的问题(尽管我仍然怀疑它是否存在缓存问题)。
答案 0 :(得分:0)
ViewLocationFormats
和AreaViewLocationFormats
是虚拟的吗?如果是这样,您可以将该值放在HttpContext.Current.Items
集合中,并从重写的属性中检索它。
答案 1 :(得分:0)
我几乎肯定RazorViewEngine不是要在运行时修改,而只是在Global.asax Application_Start中配置。我相信RazorViewEngine实例在启动后的应用程序域的生命周期中存在。
如果您需要添加其他ViewLocationFormats或AreaViewLocationFormats,请在Application_Start中执行此操作。保证Application_Start每个App Domain只运行一次。