8

ポストバック中にセッション ID が不思議なことにクリアされているように見える問題を解決しようとしています。値が設定されていると確信しており、そのセッションをクリアしているコード内の他の場所はありません。また、ページのビューステートにセッション ID の値を保存しています。ポストバック中、ビューステートは空です。これは、基本的に、値がビューステートに割り当てられたときにセッション変数が null だったことを意味します。コードの実行中に、タイムアウトのためにセッションオブジェクトがクリアされる可能性はありますか?

次のコードがあるとしましょう。

if (session["id"] == null)                                        :line1
{                                                                 :line2
   session["id"] = // Generate some unique id                     :line3 
}                                                                 :line4

viewstate["id"] = session["id"];                                  :line5

session["id"] が line1 で null でなくても、タイムアウトのために line5 で null になる可能性は理論的にありますか?

4

3 に答える 3

3

私はノーと言わなければならないでしょう。サイトを作成し、セッション タイムアウトを 1 (分) に設定しました

<system.web>
    <compilation debug="true" targetFramework="4.0" />
  <sessionState timeout="1"></sessionState>
</system.web>

次に、これを含む Web ページをページの読み込みに追加しました

    protected void Page_Load(object sender, EventArgs e)
    {
        Session["Test"] = "Tester";

        //Should be longer than the 1 minute session timeout
        Thread.Sleep(120001);

        Response.Write(String.Format("Session[\"Test\"] = {0}", Session["Test"]));
    }

Cassini VS デバッガーと IIS 7 asp.net 4 でテストを行い、すべてのテストでページが Session["Test"] = Tester で読み込まれます。また、スリープ中にアプリケーション プールを手動でリサイクルしようとしたところ、同じ結果が得られました。

于 2012-08-15T18:06:12.990 に答える
1

これは私のコードであり、正しく動作しています...

protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["id"] == null)
            {
                Session["id"] = "abc";
            }
            ViewState["id"] = Session["id"];
            Label1.Text = ViewState["id"].ToString();
            ViewState["id"] = Session["id"].ToString();
            Label1.Text += ViewState["id"].ToString();
        }

「セッション」を「セッション」に、「ビューステート」を「ViewState」に変更します。

于 2012-08-16T14:06:07.707 に答える
0

タイムアウトが発生した場合、5 行目に到達しないため、いいえ。プログラム、サービス、何でも実行を停止します。

于 2012-08-15T17:52:10.087 に答える