为什么RedirectToAction改变了ThreadID

本文关键字:ThreadID 改变 RedirectToAction 为什么 | 更新日期: 2023-09-27 18:19:07

我有一个web应用程序(ASP。. NET MVC 3),支持en-US、pt-BR、es-ES的本地化。

public class HomeController : Controller
{
  public ActionResult Index()
  {
    int threadId = Thread.CurrentThread.ManagedThreadId;
    string threadUICulture = Thread.CurrentThread.CurrentUICulture.ToString();
    return View();
  }
}
public class LanguageController : Controller
{
  public ActionResult EN()
  {
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    return RedirectToAction("Index", "Home");
  }
  public ActionResult ES()
  {
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
    int threadId = Thread.CurrentThread.ManagedThreadId;
    return RedirectToAction("Index", "Home");
  }
  public ActionResult PT()
  {
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
    return RedirectToAction("Index", "Home");
  }
}

我以culture en-US启动应用程序,使用ActionLink,我调用Language/ES将其更改为西班牙语并重定向到索引页。但是不行,索引页还是英文的…

我看到线程Id是不同的方法LanguagesController。ES和HomeController.Index.

在ASP上管理本地化的最佳方法是什么?. NET MVC应用程序?

为什么RedirectToAction改变了ThreadID

这是因为每个请求都是从线程池中提取的线程中提供服务的。因此,当第一个请求可以在线程A上提供时,第二个请求可以在线程b上提供。您将需要在某个地方持久化有关当前区域性的信息。这可能是:会话,cookie,一些url路由参数等。请看下面的本地化指南:

我想,在你的控制器中,设置session的文化应该可以工作。

会话("文化")= new CultureInfo("es-ES");

HttpContext。会话("文化")= new CultureInfo("es-ES");