我有以下示例代码可以重现我的问题:
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模式。
答案 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");
}
}