La lingua attivo è determinato dal URL e quindi impostare sulPasso CurrentUICulture a Async Task in ASP.NET MVC 3.0
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
In questo modo le traduzioni vengono recuperati dai file di risorse corretti.
Quando si utilizza l'azione Async sui controller, abbiamo un thread in background, in cui Thread.CurrentThread.CurrentUICulture è impostato su OS predefinito. Ma anche sul thread in background abbiamo bisogno della lingua corretta.
ho creato un'estensione TaskFactory di passare la cultura al thread in background e sembra in questo modo:
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();
});
}
Questo mi permette di effettuare le seguenti operazioni in un sistema di azione:
[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);
}
Questo tutto funziona perfettamente, ma ho alcune preoccupazioni.
È questo il modo corretto di estendere un'azione impostando la cultura prima di richiamare l'azione originale?
Qualcuno sa di un modo diverso per passare a CurrentUICulture su un thread in background per le azioni Async ASP.NET MVC?
- La sessione non è un'opzione.
- Stavo pensando di utilizzare CallContext.
Altri commenti su questo codice?
Grazie
Ecco come l'ho sempre fatto, anche nelle applicazioni ASP. Avvolgi il codice "new thread" in qualcosa che rende impossibile dimenticare di passare lo stato locale del thread necessario per i nuovi thread. – bzlm
Domanda simile http://stackoverflow.com/questions/5144314/in-net-best-way-for-keeping-currentculture-on-new-thread –
Bel metodo! Mi chiedo solo: perché 'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name);' e non basta semplicemente assegnare lo stesso 'cultureInfo'? –