为什么Session.Remove如果后面跟一个抛出的异常没有删除会话对象?

时间:2013-07-09 20:03:29

标签: c# asp.net session-state

我有以下示例代码可以重现我的问题:

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模式。

1 个答案:

答案 0 :(得分: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");    
    }
}