10

次の簡単なテストを実施しました。

  1. web.config には、`sessionState timeout=40 mode=InProc` があります。
  2. ページタグに「EnableSessionState = "ReadOnly"」が設定された空のページ
  3. コードビハインド:
protected void Page_Load(object sender, EventArgs e)
{

    if (Session["dt"] == null)
        Session["dt"] = DateTime.Now;

    Session["dt"] = ((DateTime)Session["dt"]).AddYears(1);
    Response.Write(Session["dt"].ToString());
}

同時ポストバックの結果は次のようになります。

1- 2015 年 11 月 13 日 10:00:00
2- 2016 年 11 月 13 日 10:00:00
3- 2017 年 11 月 13 日 10:00:00
4- 2018 年 11 月 13 日 10:00:00
5- 13/11/2019 10:00:00
6- 13/11/2020 10:00:00
...

これは、セッション変数が更新されていることを明確に示しています。MSDN では、次を見つけることができます: http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx

セッション状態モードをオフに設定すると、アプリケーションのセッション状態を無効にできます。アプリケーションの特定のページのみのセッション状態を無効にする場合は、@ Page ディレクティブの EnableSessionState 値を false に設定できます。EnableSessionState 値を ReadOnly に設定して、セッション変数への読み取り専用アクセスを提供することもできます。

アプリケーションのほぼすべてのページで読み取り/書き込み操作を実行します。ただし、これにより、同じクライアントに対して 2 つの http 要求を同時に実行できなくなります。最初のリクエストは、サーバーが 2 番目のリクエストを処理するまで終了する必要があります。いくつかの調査の後、明らかにセッションの排他ロックが原因でした。好奇心のために、セッション状態を ReadOnly に設定しようとしましたが、排他ロックが定義されていない編集可能のようです。

質問:

1- Readonly は Readonly を意味しますか (したがって、asp にはバグがあります)、それとも別のものですか?

2- セッションが ReadOnly 状態で編集可能に見える限り、心配することはありますか? 本番環境でこのまま使用しても安全だと思いますか?

ありがとう

4

3 に答える 3

3

ReadOnly フラグは、ページ/アプリケーションに対する意図を示します。セッション変数の保護ではありません。

ページ宣言で ReadOnly を設定すると、ページが Session 変数を更新しないことを宣言するだけです。しかし、それを行う場合は、自己責任で行ってください。

宣言 (およびユーザーの動作) は、ASP.NET の高速化に役立ちます。実際、セッション状態モジュールはロック メカニズムを実装し、状態値へのアクセスをキューに入れます。

セッション状態の書き込みアクセスを持つページは、要求が完了するまで、セッションでライター ロックを保持します。セッション状態の読み取りアクセス権を持つページは、リクエストが終了するまでセッションのリーダー ロックのみを保持します**。

各ページが作成するセッション状態の使用を正確に宣言することは、ページのパフォーマンスを最適化する方法であり、コードをきれいに保つ方法でもあります。

最後に、次のように設定して、Session 変数 (読み取りと書き込みの両方) を完全に無効にすることができます。

<sessionState mode="Off">

しかし、私はそれがあなたが望むものだとは思いません。

于 2014-11-13T12:16:02.137 に答える