Активный язык определяется по URL и затем устанавливается на
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
. Таким образом, переводы извлекаются из правильных файлов ресурсов.
При использовании асинхронного действия на контроллерах,у нас есть фоновый поток, в котором для Thread.CurrentThread.CurrentUICulture установлено значение по умолчанию для ОС.Но также в фоновом потоке нам нужен правильный язык.
Я создал расширение TaskFactory для передачи культуры в фоновый поток, и оно выглядит так:
public static Task StartNew(this TaskFactory taskFactory, Action action, CultureInfo cultureInfo)
{
return taskFactory.StartNew(() =>
{
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
action.Invoke();
});
}
Это позволяет мневыполните следующие действия в контроллере действий:
[HttpPost]
public void SearchAsync(ViewModel viewModel)
{
AsyncManager.OutstandingOperations.Increment();
AsyncManager.Parameters["task"] = Task.Factory.StartNew(() =>
{
try
{
//Do Stuff
AsyncManager.Parameters["viewModel"] = viewModel;
}
catch (Exception e)
{
ModelState.AddModelError(string.Empty, ResxErrors.TechnicalErrorMessage);
}
finally
{
AsyncManager.OutstandingOperations.Decrement();
}
}, Thread.CurrentThread.CurrentUICulture);
}
public ActionResult SearchCompleted(Task task, ViewModel viewModel)
{
//Wait for the main parent task to complete. Mainly to catch all exceptions.
try { task.Wait(); }
catch (AggregateException ae) { throw ae.InnerException; }
return View(viewModel);
}
Это все работает отлично, но у меня есть некоторые проблемы.
Это правильный способ расширить действие, установив культуру перед вызовомисходное действие?
Кто-нибудь знает о другом способе передачи CurrentUICulture в фоновый поток для асинхронных действий ASP.NET MVC?
- Сеанс не является вариантом.
- Я думал об использовании CallContext.
Любые другие комментарии к этому коду?
Спасибо