5

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

+0

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

+0

Domanda simile http://stackoverflow.com/questions/5144314/in-net-best-way-for-keeping-currentculture-on-new-thread –

+0

Bel metodo! Mi chiedo solo: perché 'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name);' e non basta semplicemente assegnare lo stesso 'cultureInfo'? –

risposta

1

Sembra il modo descritto nella domanda è la risposta.

Problemi correlati