MVC Razor ViewEngine не является потокобезопасным? - PullRequest
5 голосов
/ 19 февраля 2011

В настоящее время у меня есть приложение .net mvc3, которое отвечает за управление аналогичными представлениями в нескольких местах, которые также используют одни и те же контроллеры, например, site1/v1/views/index.cshtml и site1/v2/views/index.cshtml.

Способ, которым это обрабатывается, заключается в создании CustomControllerFactory, который наследуется от DefaultControllerFactory, и в методе CreateController очистите существующие механизмы представления и добавьте новый настраиваемый viewEngine, который задает форматы расположения представления, основанные на текущем URL.

Если пользователь приземляется на site1.com/v1/index.cshtml, viewengine будет определять местоположения просмотра:

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

Проблема, с которой я сталкиваюсь, заключается в том, что если несколько пользователей одновременно попадают на разные страницы примерно в одно и то же время, все пользователи будут видеть одно и то же представление.

Изначально я думал, что это связано с кэшированием , но после явной установки usecache = false в пользовательском viewEngine кажется, что это связано с тем, что класс ViewEngines не является поточно-ориентированным .

У кого-нибудь есть идеи о том, как я могу добиться того же результата, но другим способом?

заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 19 февраля 2011

Коллекция ViewEngines является статической коллекцией, поэтому ее значения распределяются между запросами.То, что вы пытаетесь сделать, возможно, но то, как вы это делаете, неверно.

Один простой подход - это написать собственный движок представления, производный от RazorViewEngine, и переопределить метод FindView.Этот метод вызывается один раз за запрос.В вашей реализации вызовите base.FindView, а затем измените результат (если он не нулевой), чтобы включить необходимую информацию о сайте.

Скотт Хансельман имеет сообщение в блоге, в котором показан один пример поиска в другом месте для просмотрачерез пользовательский вид двигателя.http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

1 голос
/ 19 февраля 2011

Встроенные двигатели вида являются поточно-ориентированными. Ваша проблема - кеширование или ваш пользовательский механизм просмотра. Проверьте кеширование комментариев по ссылке в другом ответе.

...