我遇到会话过期问题。首先它每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");
}
但我得到错误:
在此背景下无法获得响应。
答案 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中调用它太晚了。
从内存中卸载服务器控件时。
在页面呈现给客户端之后会发生这种情况 - 因此您无法发出响应重定向,甚至无法从那里发出Server.Transfer。
作为Kelsey commented,你真的应该尝试重构一下你的设计 - 或许早些时候执行这个检查(比如在你做大部分处理之前说PageLoad)。
此外,您可能应该知道,窗体超时与会话超时不同 - 前者设置登录cookie在登录时检查“记住我”框时保持多长时间,而后者确定用户在服务器将其视为“新”用户(无论身份验证状态如何)之前保持空闲的时间,并使用以下命令配置:
<sessionState timeout="60" />
答案 6 :(得分:-2)
尝试将其设置为最大值525601,看看是否仍有相同的问题。如果你这样做,我怀疑这不是一个会话问题。