5

El idioma activo se determina a partir de la URL y luego establece en elPass CurrentUICulture a asíncrono de tareas en ASP.NET MVC 3.0

Thread.CurrentThread.CurrentUICulture = cultureInfo; 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

De esa manera las traducciones son recuperados de los archivos de recursos correctos.

Al utilizar la acción Async en los controladores, tenemos un hilo de fondo, donde el Thread.CurrentThread.CurrentUICulture se establece de nuevo en el sistema operativo por defecto. Pero también en el hilo de fondo necesitamos el lenguaje correcto.

creé una extensión TaskFactory para pasar la cultura al hilo de fondo y se ve así:

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(); 
    }); 
} 

Esto me permite hacer lo siguiente en un controlador de acción:

[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); 
} 

Este todo funciona perfectamente, pero tengo algunas preocupaciones.

¿Es esta la forma correcta de extender una acción configurando la referencia cultural antes de invocar la acción original?

¿Alguien sabe de una manera diferente de pasar te CurrentUICulture a una cadena de fondo para las acciones ASP.NET MVC Async?

  • La sesión no es una opción.
  • Estaba pensando en utilizar el CallContext.

¿Algún otro comentario sobre este código?

Gracias

+0

Así es como siempre lo he hecho, incluso en aplicaciones ASP. Envuelva el código "nuevo subproceso" en algo que hace que sea imposible olvidar pasar el estado de subproceso local que se necesita para nuevos subprocesos. – bzlm

+0

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

+0

¡Buen método! Solo me pregunto: ¿por qué 'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name);' y no simplemente asignar el mismo 'cultureInfo'? –

Respuesta

1

parece que la forma descrita en la pregunta es la respuesta.

Cuestiones relacionadas