当前位置:编程学习 > C#/ASP.NET >>

session在远程服务器失效

网站在本地运行一切正常,局域网运行也正常,今天把网站挂到外网上去,发现session失效了。
登录页面记录用户名为session,其他页面运行都要先判断session是否为null,如果为null会返回登录页面。在外网登录该网站,填完正确的用户名和密码后,会马上返回登录页面,就行刷新了一边登录页面一样。
远程服务器客服说不是他们那边的问题。
请问,到底是什么原因导致session失效? --------------------编程问答-------------------- 没有大大知道吗?很急啊,谢谢了 --------------------编程问答-------------------- 拜托了 --------------------编程问答-------------------- 先检查下代码,看看代码里面有没有清session的动作,
实在不行,就换cookie吧。。 --------------------编程问答-------------------- 导致Session失效的原因有很多。。

尝试着用Session+Cookie. --------------------编程问答-------------------- 先查看代码,确定是否是session问题,或者是不是浏览器之类的问题。

导致session失效的原因很多 google 百度 一堆,解决方法也很多 --------------------编程问答-------------------- 要先看session是以什么形式存储的再做判断 --------------------编程问答-------------------- 本地运行都正常的,原先一直在局域网使用该系统,按说程序应该没问题。前几天有客户要看该系统,让我们把系统挂到外网上先看看,但是在外网上,session根本就不存值 --------------------编程问答-------------------- 这是登录界面的按钮
 protected void btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                Staff staff = PollManager.DAL.StaffDAL.GetModelByName(this.txtUser.Text.ToString());
                if (staff == null)
                {
                    lblMsg.Text = "不存在指定的用户!";
                    return;
                }
                string pass = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(this.txtPass.Text.ToString().Trim(), "MD5");
                if (!staff.Password.Trim().Equals(pass))
                {
                    lblMsg.Text = "密码错误!";
                    txtPass.Focus();
                    return;
                }
                else
                {
                    Guid userId = staff.uid;
                    Session["user"] = userId;

                }
            }
            catch (System.Data.SqlClient.SqlException)
            {
                lblMsg.Text = "无法连接到登录服务器";
                return;
            }

            string url = (string)Request["return"];
            if (String.IsNullOrEmpty(url))
            {
                Response.Redirect("~/Index.aspx");
            }
            else
                Response.Redirect(url);

        }
--------------------编程问答-------------------- 这是其他页面对session的判断
 protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["user"] == null)
            {
                //用户未登录转到登录页面
                string url = "/Login.aspx?return=" + Toolkit.GetPagePath(Request);
                Response.Redirect(url);
            }

            if (!IsPostBack)
            {
                Guid userId = (Guid)Session["user"];
                Staff staff = PollManager.DAL.StaffDAL.GetModel(userId);
                this.lbluser.Text = staff.Name;

                if (staff.Job.Name.Trim().Equals("管理员"))
                {
                    this.user.Visible = false;
                }
                else
                {
                    tabAdmin.Visible = false;
                    setTime.Visible = false;
                }

                string endTime = System.Web.Configuration.WebConfigurationManager.AppSettings["SetEndTime"];
                txtSetTime.Value = endTime;
                this.lblTime.Text = "投票截止时间:" + endTime + ", 逾期视为弃权!";

            }
        }
--------------------编程问答-------------------- asp.net 执行 Response.Redirect 时会强制终止当前Response ,不发送当前页面的cookie 给浏览器,而是发送一个指令告诉浏览器重新发送一个新的HTTP请求到新的URL,结果导致当前的Session 丢失。

老外的一个解决办法就是使用Response.Redirect(“~/default.aspx”, false) --------------------编程问答-------------------- session丢失是很正常的事情。在Inproc模式下,asp.net本来就不保证session。这在msdn上关于《应用程序状态管理》的文档中写的很清楚。怪只怪你学习asp.net的时候被入门书忽悠了,只知道套用session使用的代码,而没有从一开始就学会不用session如何编写程序。

session丢失的原因有千百种,微软自己也说不清楚。IIS以及asp.net,会在正常的系统维护中重新启动应用程序池,这样才能保证网站总是看起来正常连续运行。例如你可以在自己的IIS上配置,当CPU使用到7%、内存使用到30%M、连接数超过200个、连续使用10分钟等等条件时就自动重新回收一次。等等。另外比如应用程序一旦修改了出app_data目录下其它目录的文件、子目录,网站应用也就瞬间重启了。等等这些都会引起session以及静态内存变量值等等一切内存数据丢失。 --------------------编程问答--------------------
引用 7 楼  的回复:
本地运行都正常的,原先一直在局域网使用该系统,按说程序应该没问题。前几天有客户要看该系统,让我们把系统挂到外网上先看看,但是在外网上,session根本就不存值


如果说“根本就不存值”这个有点夸张。除非你们选择了某些实在是太烂的虚拟值主机。正常情况下,每隔10几分钟丢失一次session,这还是比较正常的。

实际上在我们自己拥有的独立的服务器上,也会因为各种原因(例如上面说的各种编程设计原因)而使得session经常丢失。因为asp.net本来设计的时候就是默认假设服务程序随时重启的,这个系统的设计目的就是在系统重启时从客户端看起来感觉不到,而能够继续操作。

因此编程时应该尽量避免使用session,这样才能避免出现那种“动不动就让用户重新登录”的幼稚程序。 --------------------编程问答--------------------
引用 10 楼  的回复:
asp.net 执行 Response.Redirect 时会强制终止当前Response ,不发送当前页面的cookie 给浏览器,而是发送一个指令告诉浏览器重新发送一个新的HTTP请求到新的URL,结果导致当前的Session 丢失。

老外的一个解决办法就是使用Response.Redirect(“~/default.aspx”, false)


就算此时“不发送当前页面的cookie 给浏览器”,怎么就会导致session丢失呢? --------------------编程问答--------------------
引用 13 楼  的回复:
引用 10 楼  的回复:

asp.net 执行 Response.Redirect 时会强制终止当前Response ,不发送当前页面的cookie 给浏览器,而是发送一个指令告诉浏览器重新发送一个新的HTTP请求到新的URL,结果导致当前的Session 丢失。

老外的一个解决办法就是使用Response.Redirect(“~/default.aspx”, false)

……


你看看吧
http://weblogs.asp.net/bleroy/archive/2004/08/03/don_2700_t-redirect-after-setting-a-session-variable-_2800_or-do-it-right_2900_.aspx
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,