加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC Razor ViewEngine不是线程安全的吗?

发布时间:2020-12-16 03:33:25 所属栏目:asp.Net 来源:网络整理
导读:我目前有一个.net mvc3应用程序,负责管理多个位置的类似视图,这些位置也使用相同的控制器,例如site1 / v1 / views / index.cshtml和site1 / v2 / views / index.cshtml. 处理它的方法是创建一个继承自DefaultControllerFactory和CreateController方法的Custo
我目前有一个.net mvc3应用程序,负责管理多个位置的类似视图,这些位置也使用相同的控制器,例如site1 / v1 / views / index.cshtml和site1 / v2 / views / index.cshtml.

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

如果用户登陆site1.com/v1/index.cshtml,则viewengine将指定以下视图位置:

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有更多关系.

有没有人对我如何能够以不同的方式实现相同的结果有任何想法?

提前致谢.

解决方法

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

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

Scott Hanselman有一篇博文,展示了通过自定义视图引擎在另一个位置查看视图的示例. http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读