0

私が知っているように、静的クラスの静的メソッドは、Web アプリケーション内のすべてのユーザーに共有されます。
HttpContext.Current.Session["Key"] は静的クラスでどのように機能しますか。
セッションはすべてのユーザーに対して作成されるためです。
以下の例では、セッションでユーザー名を返します

 using System.Web;

 namespace WebApplication1 
 {
    public static class UserInfo
    {
        public static string showName()
        { 
            return HttpContext.Current.Session["UserName"] ?? "";
        }
     }
  }

これが答えたかもしれないことは知っていますが、答えを見つけることができませんでした。

4

2 に答える 2

2

それはうまく動作します。はい、クラスは静的である可能性がありますが、メモリのさまざまなセクションにアクセスするため、ここから競合が発生することはありません。

内部的には、Session は一意のキー (現在のセッション ID だと思います) を使用して辞書からデータを保存および取得するという事実を除いて、Session は Cache とまったく同じように機能すると思います。したがって、Session["Foo"]= "Bar" を保存すると、実際には Session[session_id+"Foo"] = "Bar" が実行されます。

アップデート

私の仮定は準確認されています:

状態プロバイダーの比較 既定では、ASP.NET アプリケーションはセッション状態をワーカー プロセスのメモリ、特に Cache オブジェクトのプライベート スロットに格納します。InProc モードが選択されている場合、セッション状態は Cache オブジェクト内のスロットに保存されます。このスロットはプライベートとしてマークされており、プログラムからアクセスすることはできません。別の言い方をすれば、ASP.NET データ キャッシュ内のすべての項目を列挙すると、特定のセッションの状態のように見えるオブジェクトは返されません。Cache オブジェクトは、プライベートとパブリックの 2 種類のスロットを提供します。プログラマーは公開スロットを追加および操作できます。システム、特に system.web アセンブリで定義されたクラスは、それ自体のためにプライベート スロットを予約します。アクティブな各セッションの状態は、キャッシュ内のプライベート スロットを占有します。スロットの名前はセッション ID にちなんで付けられ、値は、SessionStateItem という名前の文書化されていない内部クラスのインスタンスです。InProc 状態プロバイダーは、セッションの ID を受け取り、キャッシュ内の対応する要素を取得します。次に、SessionStateItem オブジェクトのコンテンツが HttpSessionState ディクショナリ オブジェクトに渡され、Session プロパティを介してアプリケーションからアクセスされます。ASP.NET 1.0 のバグにより、Cache オブジェクトのプライベート スロットがプログラムで列挙可能になることに注意してください。ASP.NET 1.0 で次のコードを実行すると、現在アクティブな各セッションの状態がパックされたオブジェクトに対応するアイテムを列挙できます。次に、SessionStateItem オブジェクトのコンテンツが HttpSessionState ディクショナリ オブジェクトに渡され、Session プロパティを介してアプリケーションからアクセスされます。ASP.NET 1.0 のバグにより、Cache オブジェクトのプライベート スロットがプログラムで列挙可能になることに注意してください。ASP.NET 1.0 で次のコードを実行すると、現在アクティブな各セッションの状態がパックされたオブジェクトに対応するアイテムを列挙できます。次に、SessionStateItem オブジェクトのコンテンツが HttpSessionState ディクショナリ オブジェクトに渡され、Session プロパティを介してアプリケーションからアクセスされます。ASP.NET 1.0 のバグにより、Cache オブジェクトのプライベート スロットがプログラムで列挙可能になることに注意してください。ASP.NET 1.0 で次のコードを実行すると、現在アクティブな各セッションの状態がパックされたオブジェクトに対応するアイテムを列挙できます。

ソース: http://msdn.microsoft.com/en-us/library/aa479041.aspx

(フォーマット失礼します。携帯からの投稿です)

于 2013-01-06T04:26:41.153 に答える
1

静的プロパティと静的フィールドを混同していると思います。魔法は、通常の静的フィールドからではなく、(大まかに) 実行コンテキストと呼ばれるものからHttpContext.Currentインスタンスを返す静的プロパティであることです。これにより、ASP.NET は、特定のスレッドが現在属している多くの同時要求のどれに属しているかを確認できます。HttpContext適切なHttpContextインスタンスを返すために。

その特定のインスタンスには、Sessionユーザー専用の辞書があります。

于 2013-01-06T04:43:55.880 に答える