簡體   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