会话到期并抛出异常

时间:2009-12-07 23:02:36

标签: c# asp.net session

我遇到会话过期问题。首先它每20分钟到期一次,它会抛出一个错误......

我试图通过以下方式修复它:

if (Session["userName"].ToString() == null)
{
   Session.RemoveAll();
   Response.Redirect("~/Login.aspx?sessionError=" + "*Session Expired on pageload PleaseLog in again");
}

但是我收到以下错误:

  

对象引用未设置为对象的实例。

我的堆栈跟踪是:

  

[NullReferenceException:对象引用未设置为对象的实例。]      C:\ Users \ jagmit \ Documents \ Visual Studio 2008 \ Projects \ copiunGUI \ copiunGUI \ Site1.Master.cs中的copiunGUI.Site1.checksession():224      C:\ Users \ jagmit \ Documents \ Visual Studio 2008 \ Projects \ copiunGUI \ copiunGUI \ Site1.Master.cs中的copiunGUI.Site1.TreeViewMain_Unload(Object sender,EventArgs e):210      System.Web.UI.Control.OnUnload(EventArgs e)+8681754      System.Web.UI.Control.UnloadRecursive(布尔配置)+252      System.Web.UI.Control.UnloadRecursive(布尔配置)+188      System.Web.UI.Control.UnloadRecursive(布尔配置)+188      System.Web.UI.Control.UnloadRecursive(布尔配置)+188      System.Web.UI.Control.UnloadRecursive(布尔配置)+188      System.Web.UI.Page.UnloadRecursive(布尔配置)+23      System.Web.UI.Page.ProcessRequestCleanup()+43

我的web.config是:

<authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="~/Default.aspx" name="Cookie" timeout="10080" path="/">
    </forms>
</authentication>
<authorization>
    <deny users="?"/>
    <allow users="*"/>
</authorization>

请帮助.......

由于

感谢您输入的人......

我试过了:

if (Session["userName"] == null)
{
   Session.RemoveAll();
   Response.Redirect("~/Login.aspx?sessionError=" + "*Session Expired on pageload PleaseLog in again");
}

但我得到错误:

  

在此背景下无法获得响应。

7 个答案:

答案 0 :(得分:9)

问题在于:

if (Session["userName"].ToString() == null)

当Session [“UserName”]是一个空对象引用时,你无法正确地调用.ToString()。

试试这个......

if (Session["userName"] == null)...

答案 1 :(得分:2)

你不应该在对可能为null的会话对象的引用上调用.ToString()(因为到期)

见下文:

if (String.IsNullOrEmpty(Session["userName"]))
    {
        Session.RemoveAll();
        Response.Redirect("~/Login.aspx?sessionError=" + "*Session Expired on pageload PleaseLog in again");
    }

答案 2 :(得分:1)

修复错误。

String.IsNullOrEmpty(会话[ “userName的”])

更多信息。 如果用户离开他的计算机或者每20分钟没有按下您的服务器,他们的会话将会过期。这是默认值。您可以使用客户端javascript每隔15分钟ping您的服务器,以便在浏览器打开时不会丢失会话。您还可以增加会话超时。

答案 3 :(得分:1)

如果您在页面的上下文中执行此操作,则代码应为:

if (Session["userName"] == null)
{
     Session.Abandon();
     Response.Redirect("~/Login.aspx?sessionError=" + "*Session Expired on pageload PleaseLog in again", true);
}

您需要先检查Session密钥是否为空,然后才能对其进行操作。这就是你得到例外的原因。确保true末尾有Response.Redirect,以确保您的回复立即结束。最后,请注意Session.Abandon();,这对您来说可能比您当前使用的RemoveAll更有用。

至于你关于Response对象不可用的其他评论,除非你在页面上下文之外的类中执行此操作,否则应该是这样。如果你这不应该编译。

答案 4 :(得分:0)

有人刚刚在我的QA服务器上修复了超时问题。这是因为默认的IIS设置为20分钟,它会覆盖web.config设置。请查看以下链接以解决问题。

How to change idle timeout settings.

对于另一个问题,你在Session [“userName”]上使用String.IsNullOrEmpty

This explains why the above setting affects your session timeout

答案 5 :(得分:0)

您看到错误“响应在此上下文中不可用”,因为您在page lifecycle中调用它太晚了。

TreeView's Unload Event被称为:

  

从内存中卸载服务器控件时。

在页面呈现给客户端之后会发生这种情况 - 因此您无法发出响应重定向,甚至无法从那里发出Server.Transfer。

作为Kelsey commented,你真的应该尝试重构一下你的设计 - 或许早些时候执行这个检查(比如在你做大部分处理之前说PageLoad)。

此外,您可能应该知道,窗体超时与会话超时不同 - 前者设置登录cookie在登录时检查“记住我”框时保持多长时间,而后者确定用户在服务器将其视为“新”用户(无论身份验证状态如何)之前保持空闲的时间,并使用以下命令配置:

<sessionState timeout="60" /> 

答案 6 :(得分:-2)

尝试将其设置为最大值525601,看看是否仍有相同的问题。如果你这样做,我怀疑这不是一个会话问题。