0

私の問題を再現する次のサンプル コードがあります。

protected void Page_Load(object sender, EventArgs e)
{
    var test = Session["test"] as string;
    if (test == null)
    {
        Session["test"] = "test";
        Response.Redirect(Request.Path, false);
    } 
    else
    {
        Session.Remove("test");
        throw new Exception();
    }
}

基本的に、例外がスローされるかどうかに関係なく、セッションからオブジェクトを削除できるようにしたいと考えています。上記のコード ブロックは、最初のページの読み込みでは問題なく実行されますが、リダイレクトが発生すると、その後のすべてのページの読み込みで引き続き例外がスローされます。オブジェクトが実際にセッションから削除されることはありません。

スローに時計を置くと、セッション オブジェクトが削除されていることがわかります。

編集 #1:もう少しテストした後、この動作は StateServer 状態モードでのみ存在することに気付きました。InProc に対してテストしたところ、期待どおりに動作するようです。SQL Server モードに対してテストできません。

4

1 に答える 1

0

あなたの問題は、値の欠如をSession空白(または空白)と同じように扱っていることだと思います。

代わりに次のコードをお勧めします。

protected void Page_Load(object sender, EventArgs e)
{
    // Does the value exist in Session?
    if(null != Session["test"])
    {
        // No, so throw an exception
        throw new Exception();
    }

    // Grab the value from Session and cast it to a string
    var test = Session["test"] as string;

    // Is the string null or blank?
    if (string.IsNullOrWhiteSpace(test))
    { 
        // Yes, so give it a value of 'test' and redirect to another page
        Session["test"] = "test";
        Response.Redirect(Request.Path, false);
    } 
    else
    {
        // The value was not null or blank so rip it out of Session
        Session.Remove("test");    
    }
}
于 2013-07-09T20:10:20.833 に答える