У меня есть веб-приложение ASP.NET MVC 5, работающее под веб-сайтом в IIS 8, где мне нужно программно менять язык во время выполнения пользователем предпочтение от того, что я прочитал из БД и сохранил в переменной сеанса, и это значение может измениться во время выполнения с выпадающим списком.Ресурсы локализации ASP.NET MVC 5 замораживаются и не меняют язык, несмотря на изменение CurrentThread.CurrentCulture
Проблема в том, что языковые ресурсы иногда не меняются, несмотря на то, что CurrentCulture делает и Хуже всего то, что они замерзают на уровне приложений, заставляя все остальные пользовательские сеансы замораживать и на этом языке и отображаться только во всех приложениях сеансы на том же языке, на котором застрял, независимо от их предпочтения, или если они даже пытаются изменить свой язык во время выполнения, которое при нормальной работе заставляет CurrentThread.CurrentCulture изменять.
Я использую скрытый текст во взглядах , чтобы отслеживать, что CurrentThread.CurrentCulture было и меняется, как ожидается, поэтому проблема должна быть в другом месте.
Это блок бритвы я использую для проверки CurrentCulture
<div style="display:none; visibility: hidden;">Thread
@System.Threading.Thread.CurrentThread.CurrentCulture</div>
И во время выполнения, когда язык или Resx являются заморожен/stucked на уровне приложений значение действительно правильный и выбран, но это не соответствует язык, отображаемый в представлениях, и обычно не работает нормально, пока я не сделаю, например, изменение в файле web.config или перезапустил приложение, а затем он отлично работает некоторое время, но не длится слишком много времени.
<div style="display:none; visibility: hidden;">Thread en-US</div>
Проблема заключается в том, что это происходит на уровне приложений для всех пользовательских сессий и CurrentCulture на самом деле меняется, как ожидается, когда приложение работает нормально, и всякий раз, когда перезапуск эти не происходит, но как-то раз в определенное время что-то спускового во время сеансов пользователя до замораживание языка всех текущих сеансов и даже новых сеансов.
Я попытался разместить изменение логики культуры в представлениях бритвы, фильтрах действий и базовом контроллере, но это не решило проблему, ранее у меня был базовый контроллер, который весь мой контроллер унаследовал, и логика в Global.asax .cs изменить и определить культуру.
Мой текущий подход состоял в том, чтобы удалить базовый контроллер и использовать как в Global.asax.cs Application_AcquireRequestState (я тоже пытался использовать Application_BeginRequest, но как-то слишком рано в жизненном цикле) и Action Filter.
Это в Global.asax.cs
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
if (Context.Session != null && Context.Session["CultureName"] != null)
{
string cultureName = Context.Session["CultureName"].ToString();
CultureInfo cultureInfo = new System.Globalization.CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
}
И мой фильтр действий, как этот
public class CultureActionAttribute : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
string cultureName = null;
string tenant = filterContext.RouteData.Values["Tenant"] as string;
if (!String.IsNullOrWhiteSpace(tenant))
{
TenantService tenantService = new TenantService(tenant);
cultureName = CultureHelper.GetImplementedCulture(tenantService.Tenant.LanguageCulture);
tenantService.Unit.Dispose();
}
//Logic to override cultureName value by getting the user preference language
CultureInfo cultureInfo = new System.Globalization.CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
}
И я добавил его в FilterConfig
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new CultureActionAttribute());
//
}
Я даже пытался использовать ClearCachedData, когда пользователь меняет культуру.
Thread.CurrentThread.CurrentCulture.ClearCachedData();
Я думаю, что это может быть связано с кэшированием или переработкой бассейна, но я не в курсе, что попробовать дальше.
Я не использую ни одного тега глобализации в web.config.
Значение, которое отслеживается в представлениях CurrentThread.CurrentCulture всегда правильно, что неправильно, это замораживание с использованием ресурсов.
ресурсы согласуются с практикой размещения их в отдельном, посвященном стандартной папке и использовать PublicResXFileCodeGenerator, чтобы сделать их достоянием общественности, чтобы иметь возможность компилировать и быть доступными для контроллеров, представлений и т.д. папка
Ресурсы
может кто-нибудь, пожалуйста, предоставить мне другой выбор, чтобы попробовать или мысль о том, что, возможно, я делаю неправильно или что еще я могу попытаться сделать ресурсы, чтобы работать последовательно.
Я полностью согласен с вами относительно получения языка с URL-адреса с точки зрения SEO, но это частное приложение, которое вообще не требует SEO. Я действительно делаю это, потому что мой маршрут карты работает примерно так: «{tenant}/{controller}/{action}/{id}" каждый арендатор - это база данных, которая имеет предпочтение по умолчанию для языка, которое я прочитал из запроса БД и у меня есть вся эта логика в CultureHelper, но у каждого арендатора есть разные пользователи с разными языковыми предпочтениями, которые могут отменить предпочтение их арендатора. –
И раньше я использовал свой путь с помощью фильтров, как вы предлагаете, и я все еще держусь замерзая, но если я использую только это, не все правильно правильно локализовано, даже если оно не зависает. Мне нужно также использовать Application_AcquireRequestState в Global.asax, cs. То, что я не делал, это удалить логику BaseController при одновременном использовании фильтра (что могло бы сделать вашу теорию правильной), тогда я попробовал только с базовым контроллером, теперь я просто оставил только фильтр Action и AcquireRequestState вместе. –
И, как я сказал в сообщении, выбор и чтение языка всегда хорошо срабатывали, потому что я читал правильное значение в скрытом тексте взглядов. Большое спасибо за помощь. Но посмотрим, работает ли это. И тогда я могу поддерживать только один подход - либо фильтр действия, либо логику global.asax. –