【问题标题】:Changing Thread.CurrentThread.CurrentCulture on a ASHX Handler在 ASHX 处理程序上更改 Thread.CurrentThread.CurrentCulture
【发布时间】:2009-08-20 17:12:30
【问题描述】:

我想更改我网站的语言。我想我可以使用处理程序来完成,所以下拉菜单会选择http://domain.com/Handler.ashx?language=en-US,f.i。

因此,它调用具有以下代码的处理程序:

string selectedLanguage = context.Request.QueryString["language"];

    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);

    context.Response.ContentType = "text/plain";
    context.Response.Write("Hello World");

    context.Response.Redirect(context.Request.UrlReferrer.AbsoluteUri.ToString());

但是当它返回时,Thread.CurrentThread.CurrentCulture 被设置为 pt-BR,这是初始值。

我的问题是:处理程序上的线程与加载内容的 aspx 页面不同?作为解决方法,您有什么建议?

谢谢

【问题讨论】:

    标签: asp.net cultureinfo


    【解决方案1】:

    Response.Redirect() 将 HTTP 重定向发送回用户的浏览器,然后浏览器向服务器发出另一个请求。这会导致 IIS 处理一个全新的请求,因此会创建一个新线程来处理此请求。

    虽然我不推荐使用处理程序来完成此操作,但如果您切换到 Server.Transfer,您的想法可能会奏效,因为 Server.Transfer 不使用 Http 重定向,而只是创建一个新请求以通过 ASP.NET 管道发送,都在同一个初始请求的上下文中。

    希望对你有帮助,

    【讨论】:

    • 谢谢。它按我的意愿工作。只是出于好奇:在这种情况下你会推荐什么?又来了
    • 嗯,本地化和文化信息应该是您尝试在会话级别处理的内容。使用此处理程序方法可以解决通过此处理程序运行的所有请求的问题,但这会给您的代码带来不必要的压力和混乱。通过实现一些非常简单的服务器控件或类似的放置在您的页面(或母版页)上,OnInit 将线程文化设置为存储在会话中的某个值,并且当用户从下拉列表中选择一个项目时更改该值,您已经解决了整个会话的问题。我可能不明白...
    • 好的。此解决方案有效。但是每次我点击一个链接时,它都会简单地“重启”文化,我想这与你在原始答案中所说的原因相同。我要进行会话级别的尝试。
    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多