服务热线
153 8323 9821
Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息。举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少。
我们知 道,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建 立连接的时候,服务器会给用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。那么,ASP.NET 2.0提供了哪些存储SessionID的模式呢:
· Cookie(默认)。如果客户端禁止了Cookie的使用,Session也将失效。
· URL。Cookie是否开启不影响Session使用,缺点是不能再使用绝对链接了。
前面说了SessionID可以存储在客户端的Cookie或者URL中,那么Session真正的内容存储在哪里呢?ASP.NET 2.0对于Session内容的存储也提供了多种模式。
· InProc(默认)。Session存储在IIS进程中(Web服务器内存)。
· StateServer。Session存储在独立的Windows服务进程中(可以不是Web服务器)。
· SqlServer。Session存储在SqlServer数据库的表中(SqlServer服务器)。
虽然 InProc模式的Session直接存储在Web服务器IIS进程中,速度比较快,但是每次重新启动IIS都会导致Session丢失。利用后两种模 式,我们就完全可以把Session从Web服务器中独立出来,从而减轻Web服务器的压力,同时减少Session丢失的概率。
因此,SessionID存储在客户端(可以是Cookie或者URL),其他都存储在服务端(可以是IIS进程、独立的Windows服务进程或者SQL Server数据库中)。
让我们先来实践一下如何使用Session,进而回答第二个问题:Session存储的类型限制。Session不需要进行任何配置就可以使用(默认是InProc模式并且依赖Cookie)。首先,在页面上建立两个按钮。
在btn_WriteSession按钮的Click事件处理方法中,写入两个Session,一个是简单的字符串,另外一个是自定义的类。
protected void btn_WriteSession_Click(object sender, EventArgs e)
{
Session["SimpleString"] = "编程快乐";
MyUser user = new MyUser();
user.sUserName = "小朱";
user.iAage = 24;
Session["CustomClass"] = user;
}
Session的使用非常简单,直接对某个Key的Session进行赋值即可。自定义类MyUser如下:
class MyUser
{
public string sUserName;
public int iAage;
public override string ToString()
{
return string.Format("姓名:{0},年龄:{1}", sUserName, iAage);
}
}
在这里,我们覆写了ToString()方法直接返回实例的一些信息。然后,双击btn_ReadSession按钮来实现从Session中读取数据的代码:
protected void btn_ReadSession_Click(object sender, EventArgs e)
{
if (Session["SimpleString"]==null)
{
Response.Write("读取简单字符串失败
");
}
else
{
string s=Session["SimpleString"].ToString();
Response.Write(s + "
");
}
if (Session["CustomClass"]==null)
{
Response.Write("读取简单自定义类失败
");
}
else
{
MyUser user=Session["CustomClass"] as MyUser;
Response.Write(user.ToString()+"
");
}
}
在每次读取 Session的值以前请务必先判断Session是否为空,否则很有可能出现“未将对象引用设置到对象的实例”的异常。我们看到,从Session 中读出的数据都是object类型的,我们需要进行类型转化后才能使用。打开页面,先单击写入Session按钮,再单击读取Session按钮,页面输 出如 图12-1所示。
由此看来,Session能存储任意对象,是这样吗?现在得出这个结论还太早了一点,因为我们并没有实践过StateServer和SqlServer模式的Session。要把Session存储在Windows服务进程中需要进行以下几个步骤。
n 第1步是打开状态服务。依次打开“控制面板”→“管理工具”→“服务”命令,找到ASP.NET状态服务一项,右键单击服务选择启动,如图12-2所示。
n 如果你正式决定使用状态服务存储Session前,别忘记修改服务为自启动(在操作系统重启后服务能自己启动)以免忘记启动服务而造成网站Session不能使用,如图12-3所示,双击服务把服务的启动类型设置为自动。
服务正常启动后可以观察任务管理器的进程页,其中的aspnet_state.exe进程就是状态服务进程,如图12-4所示。
n 第2步,在system.web节点中加入: