2009-08-20 113 views
0

我想更改我的网站中的语言。我以为我可以使用Handler来做到这一点,所以下降将为http://domain.com/Handler.ashx?language=en-US,f.i.更改ASHX处理程序上的Thread.CurrentThread.CurrentCulture

所以,它调用处理器,具有此代码:

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页面不同?你有什么建议作为解决方法?

谢谢

回答

1

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

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

希望有帮助,

+0

谢谢。它按我想要的那样工作。 只是出于好奇:你会在这种情况下推荐什么? ty再 – 2009-08-20 17:57:48

+0

那么,本地化和文化信息应该是你试图在会话级别处理的东西。使用此处理程序方法可解决通过此处理程序运行的所有请求的问题,但这会给您的代码带来不必要的紧张和困惑。通过实现一些非常简单的服务器控件或类似于放置在页面(或主页面)上的OnInit将线程文化设置为会话中存储的某个值,并且当用户从下拉列表中选择一个项目时更改该值,你已经解决了整个会话的问题。 我可能不明白... – LorenVS 2009-08-20 18:00:58

+0

好的。此解决方案有效。但每次我点击一个链接,它只是'重新启动'的文化,我想这是出于同样的原因,你在原始答案上说。我要参加会议级别的尝试。 – 2009-08-20 18:46:54