MVC Razor ViewEngine不是线程安全的吗?

时间:2011-02-18 22:16:47

标签: asp.net-mvc razor viewengine

我目前有一个.net mvc3应用程序,负责管理多个位置的类似视图,这些位置也使用相同的控制器,例如site1/v1/views/index.cshtmlsite1/v2/views/index.cshtml

处理此方法的方法是创建一个继承自DefaultControllerFactory和CreateController方法的CustomControllerFactory,清除现有的视图引擎并添加一个新的自定义viewEngine,它根据当前网址指定视图位置格式。

如果用户登陆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有更多关系。

有没有人对如何以不同的方式完成相同的结果有任何想法?

提前感谢。

2 个答案:

答案 0 :(得分:9)

ViewEngines集合是一个静态集合,因此它的值在请求之间共享。你试图做的是可能的,但你做的方式是不正确的。

一种简单的方法是编写一个派生自RazorViewEngine的自定义视图引擎并覆盖FindView方法。每个请求调用一次该方法。在您的实现中,调用base.FindView然后修改结果(如果它不为null)以包含您需要的站点信息。

Scott Hanselman的博客文章显示了通过自定义视图引擎查看另一个位置以查看视图的示例。 http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

答案 1 :(得分:1)

内置视图引擎是线程安全的。您的问题是缓存或您的自定义视图引擎。检查其他答案中链接中的缓存注释。