[英]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引擎一次只能處理一個請求? 我懷疑是這樣的。
同樣,如果每個請求都有一個剃刀視圖引擎對象 ,那么這樣就可以了。 但我也不相信是這樣的。
更新我已經確認這是競爭條件。 我還發現了一篇文章,展示了一個動態的擴展剃刀搜索示例 ,它解決了沒有競爭條件的問題(盡管我仍然懷疑它是否有緩存問題)。
ViewLocationFormats
和AreaViewLocationFormats
虛擬的嗎? 如果是這樣,您可以將該值放在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.