2011-06-22 11 views
0

このオンラインについてはいくつかの投稿がありますが、どれも確定的な回答はありません。私の質問はこれです。私は静的プロパティを持っている場合は、セッションの値を取得/設定するだけでスレッドセーフであると宣言されているか、または潜在的に問題を引き起こしますか?私はどのようにASP.NETでセッションを持つ静的プロパティ

public static string CurrentClient { 
    get { 
     return HttpContext.Current.Session[Constants.SESSION_CURRENT_CLIENT] as string; 
    } 
    set { 
     HttpContext.Current.Session[Constants.SESSION_CURRENT_CLIENT] = value; 
    } 
} 

注:私のアプリでは、私は例えば、私は、このような現在のクライアントを保存し、一定の値にアクセスするための中央のエントリポイントの一種として機能するために私のGlobal.asaxに静的プロパティを追加しました私のget/setに静的変数を設定しないで、私は単に現在のセッションを参照しています。

アプリケーションは、IISで単一のWebアプリケーションとしてインストールされるように設定されていますが、複数の異なる「インスタンス」にサービスを提供します。基本的には、あなたが入ってくるサブドメインに応じて、必要に応じてこれらのセッション変数をすべて設定します。だから、例えば:

client1.mydomain.comが設定されます:

Global.CurrentClient = "client1"; 

client2.mydomain.comが設定されます:

Global.CurrentClient = "client2"; 

これは、それが正常に動作して、スレッドセーフであるとすべきであるように思えます2つのサブドメインはそれぞれ固有のセッションを持つ必要があるため、相互にトリップすることはありませんが、まさにこれが起こっているようです。私は何らかの理由でCurrentClient = "client2"を使ってclient1.mydomain.comにリクエストを受け取ります。

ここでは何が起こっていますか?

答えて

0

あなたは静的恐怖症の悪いケースがあるようです。あなたは彼らが何をしているのか理解していないからといって、FUDを広げている人の話を聞くべきではありません。

静的プロパティは基本的に静的メソッドです。彼らは自分ではいかなる状態も保存しません。自動プロパティはもちろん例外ですが、あなたはそれらを使用していないようです。

静的プロパティの共有状態にスレッドセーフでアクセスする限り、問題は発生しません。

「混在」しているセッションには、セッションCookieが正しいレベルに設定されていることを確認してください。 mydomain.comレベルに設定すると、すべてのサブドメインで共有されます。また、セッションにこのようなものを保存する必要があると確信していますか?すべてのリクエストで現在のドメインとあなたのクライアントのリストを比較するのが一番簡単なのでしょうか?

+0

これはまさに私の考えであったが、次に自分自身を推測し始めた。だから、おそらく起こっているのは、セッションがサブドメイン間で混乱しているということです。我々は、2つの異なるサブドメインに同時にログインすると、それが壊れているように見える – snappymcsnap

関連する問題