2011-02-18 100 views
5

我目前擁有一個.net mvc3應用程序,負責管理多個位置的相似視圖,這些位置也使用相同的控制器,例如site1/v1/views/index.cshtmlsite1/v2/views/index.cshtmlMVC Razor ViewEngine不是線程安全的?

這種處理方式是通過創建一個繼承自DefaultControllerFactory並在CreateController方法中的CustomControllerFactory,清除現有視圖引擎並添加一個新的自定義viewEngine,該視圖指定基於當前url的視圖位置格式。

如果site1.com/v1/index.cshtml用戶登陸,視圖引擎將指定的視圖位置:

string versionDirectory = "v1"; 
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml", 
          "/Views/{0}.cshtml", 
          "~/Shared/{0}.cshtml" 
          }; 

是我遇到的問題是,如果多個用戶降落在不同的頁面,在大致相同的時間所有用戶將會看到相同的觀點。

Initially i thought this was related to caching,但是在自定義viewEngine中明確設置了usecache = false之後,看起來這更像是與ViewEngines class not being thread safe有關。

有沒有人有任何關於如何完成同樣的結果,但以不同的方式?

在此先感謝。

+0

不知道你是怎麼做到的,但是所有請求之間共享任何靜態對象 - 這可能與你的問題有關... – Buildstarted

回答

9

ViewEngines集合是一個靜態集合,因此它的值在請求之間共享。你試圖做的事情是可能的,但你這樣做的方式是不正確的。

一個簡單的方法是編寫一個從RazorViewEngine派生並覆蓋FindView方法的自定義視圖引擎。該方法每個請求被調用一次。在你的實現中,調用base.FindView,然後修改結果(如果不是null)以包含你需要的站點信息。

Scott Hanselman有一篇博客文章,展示了通過自定義視圖引擎在另一個位置查看視圖的一個示例。 http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

+0

謝謝!這工作 – kfegen

+0

僅供參考該帖子中的源代碼中有一個主要的生產bug,他的視圖引擎的更新版本位於:https://bitbucket.org/shanselman/mobileviewengines/src/48310997a453/Helpers/MobileCapableRazorViewEngine.cs無論原來的帖子和我提供的新鏈接對我來說是解決修改基礎的不好選擇的關鍵.ViewLocationFormats集合不理解它是靜態的,而不是http請求作用域,而我錯誤地認爲它是靜態的。 –

1

內置視圖引擎是線程安全的。您的問題是緩存或您的自定義視圖引擎。在另一個答案中檢查鏈接中的緩存註釋。