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)--------------------编程问答-------------------- 这是其他页面对session的判断
{
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);
}
protected void Page_Load(object sender, EventArgs e)--------------------编程问答-------------------- asp.net 执行 Response.Redirect 时会强制终止当前Response ,不发送当前页面的cookie 给浏览器,而是发送一个指令告诉浏览器重新发送一个新的HTTP请求到新的URL,结果导致当前的Session 丢失。
{
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 + ", 逾期视为弃权!";
}
}
老外的一个解决办法就是使用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以及静态内存变量值等等一切内存数据丢失。 --------------------编程问答--------------------
如果说“根本就不存值”这个有点夸张。除非你们选择了某些实在是太烂的虚拟值主机。正常情况下,每隔10几分钟丢失一次session,这还是比较正常的。
实际上在我们自己拥有的独立的服务器上,也会因为各种原因(例如上面说的各种编程设计原因)而使得session经常丢失。因为asp.net本来设计的时候就是默认假设服务程序随时重启的,这个系统的设计目的就是在系统重启时从客户端看起来感觉不到,而能够继续操作。
因此编程时应该尽量避免使用session,这样才能避免出现那种“动不动就让用户重新登录”的幼稚程序。 --------------------编程问答--------------------
就算此时“不发送当前页面的cookie 给浏览器”,怎么就会导致session丢失呢? --------------------编程问答--------------------
你看看吧
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