在做系统的时候,如果我长时间没有去理会他的话,就会遇到一个问题,就是session超时的问题。造成这个问题原因就是:用户登录时间过长,没有进行操作。进而造成了session的超时之后自行销毁。所以如果我们做了相关方面的处理还好,但是如果没做的话就会报出“未将对象引用到实例”的错误。

上述说道了session,也许您会认为为什么会是session的问题呢?接下来对session进行一下了解与认识。


session简介:

       session:他是ASP的内置对象,用于提供ASP.Net应用程序中必需的功能。当然不只只是ASP.net中,像java中有。session,被称为“会话”。Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。

     Session功能:

      1.可以进行时间限制

      2.记录用户当前的状态

      3.存储用户的信息

      4.可以存储数据,便于数据的比较与传输。

      以上是根据个人平时使用得出来的。对session的介绍就到这里,如果想要更多的了解,可以上网去查更多的资料。


解决超时问题的方法:

        session引起超时问题,主要有两个条件:第一:长时间;第二:未操作。

解决方案一:

        在用到session的后台写上:


if (!IsPostBack)
            {
                if (Session["admin"] == null)
                {
                     Response.Write("<script>alert('您还没有登陆或者登陆已超时');parent.window.location.href='../ManagerMain.aspx'</script>");
                }
                else
                {
                    Session.Timeout = 30;//超时时间为30分钟
                    this.txtLoginId.Focus();
                }
            }



       这样写的话就是如果session超时了,就弹出对话框,让您重新登录,或者关闭窗体。但是如果我有10个窗体都用到了session,那么我10个窗体都要这样写吗?超过三次就要好好想想了。


解决方案二:

        在web.config中进行设置,填写以上代码


<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="1800"/>



        这个是可以解决超时问题的。同时采用这种方式,不管Cookie还是隐藏表单字段都用不着。所以,即使网页中没有使用表单,也能加入会话。

       但是这种方法,应用程序的状态将依赖于Asp.Net进程,当IIS进程崩溃或者正常重启时候,保存在进程中的状态将丢失。


解决方案三:

        同样在Web.config中进行设置


<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="120"/>



        “mode=‘StateServer’”,也就是将回话数据存储到单独的内存缓冲区中,再由单独一台机器上运行的Windows服务器来控制这个缓冲区。以上代码的“StateConnectionString”属性指定了服务所在的服务器以及要监视的端口。这样的模式,使得会话的状态的存储将不依赖于IIS进程的失败或者重启,然而一旦状态服务终止,所有会话数据都会丢失。因为他知识将数据存储在内存中。


解决方案四:

        用SQLServer进行管理。


<system.web>  <sessionState mode="SQLServer" sqlConnectionString="data source=localhost;user id=sa;password=sa" cookieless="false" sqlCommandTimeout="20" timeout="20"></sessionState> </system.web>


        以上方法并没有尝试过,但是从逻辑上考虑应该是行得通的,这个就是讲session数据存储到一个数据库服务器中。通过数据库存储会话状态,可以分贝针对扩展性以及可靠性来有效地平衡性能。这样可以为应用程序提供极大限度的可靠性。

        以上四种方法是对session超时的解决方案的总结,前三个经过尝试还是比较成功的。虽然对session知识皮毛的认识,但是只有当我们去使用的时候,才会对他进行更深入的了解,才会知道他的功能的强大性。


总结:

       条条大路通罗马,当时我在解决此问题的时候,脑子中只有一个想法就是:前人(淘宝天猫)肯定遇到过,这个问题肯定可以解决。在最初懵懂的时候,是自己一步一步的进行调试代码,得知问题根源,然后寻找解决方案。当问题来临的时候,我们不要害怕,不要没有头绪的去解决去猜想,最重要的就是发现问题的根源,然后去寻找解决方案。这应该是正确的解决问题的思路。

       学习ing....