MVC Razor ViewEngine не является потокобезопасным?

В настоящее время у меня есть приложение.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 ответа

Решение

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

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

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

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

Другие вопросы по тегам