2009-08-20 17 views
0

私のウェブサイトで言語を変更したいと思います。私はハンドラを使用してそれを行うことができると思ったので、ドロップダウンは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 again –

+0

ローカリゼーションとカルチャ情報は、セッションレベルで処理しようとするものです。このハンドラ・アプローチを使用すると、このハンドラを介して実行されるすべてのリクエストの問題が修正されますが、不要な緊張と混乱がコードに加わります。あなたのページ(またはあなたのマスターページ)の上に置き、セッションに保存された値にスレッドカルチャを設定し、ユーザがドロップダウンから項目を選択したときにその値を変更する、セッション全体の問題を解決しました。 理解できない場合があります... – LorenVS

+0

さて、この解決策は機能します。しかし、私がリンクをクリックするたびに、それは文化を単に「再開」します。元の答えに述べたのと同じ理由だと思います。私はセッションレベルの試みに行くつもりです。 –

関連する問題