Обзор
У нас есть многонациональный веб-сайт с локализованным контентом для различных стран, которым он служит. Эта локализация реализуется с использованием стандартных файлов ресурсов .Net.
Когда наше веб-приложение запускается или перерабатывается под нагрузкой в производственной среде, иногда оно отображает неправильные ресурсы для конкретной страны. Например. сайт Великобритании может показывать французский контент.
Это продолжается до тех пор, пока приложение не будет перезапущено.
Деталь
Производственная среда - IIS 8 в Windows Server 2012. Приложение реализовано в ASP.Net MVC 4.
Приложение решает, какой язык он обслуживает входящим URL. Так www.mysite.com будет британский английский www.mysite.fr будет французский и т.д.
У нас есть реализация IHttpModule, которая зарегистрирована через Web.config. В методе Init модуля он прикрепляет обработчик к событию BeginRequest. В этом методе проверяется входящий URL-адрес, а в потоке CurrentUICulture задано соответствующее значение. en-GB для www.mysite.com, fr-FR для www.mysite.fr и т.д.
Эта система работает по большей части. Однако иногда, когда приложение запускается во время приема запросов, оно будет последовательно обслуживать неправильный контент для некоторых файлов ресурсов.
Он продолжает делать это до тех пор, пока приложение не будет перезапущено. Он может снова перезапустить выполнение неправильного содержимого. Мы должны продолжать перезапуск, пока он не будет обслуживать правильный контент, после чего он будет оставаться стабильным.
Анализ
Мы смогли воспроизвести это локально на компьютере разработки, бросив запросы в приложение во время запуска (используя Fiddler). Сайт показывал немецкий контент для некоторых файлов ресурсов на британской версии сайта.
Проверяя очевидных преступников в нашем коде (что CurrentUICulture правильно настроен модулем HTTP и остается верным во время обработки запроса), мы начали смотреть на менеджера ресурсов.
При запуске приложения в этом неправильном состоянии мы рассмотрели содержимое свойства _resourceSets в классе ResourceManager. Это словарь, основанный на коде культуры ISO. Изучив содержимое en-GB, мы обнаружили, что он действительно содержал строки ресурсов из немецкой версии файла ресурсов.
Похоже, что иногда, когда сайт запускается во время получения запросов, класс ResourceManager загружает неправильный файл ресурсов для культуры или неправильно классифицирует файл в своем словаре.
Кто-нибудь еще испытал такое поведение и кто-нибудь знает об обходных решениях?
Спасибо.