SESSION
1.概述
(1) 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丢失的概率。
2.Session的使用
(1) InProc 模式的写入
Session["SimpleString"] = "编程快乐";
MyUser user = new MyUser();
user.sUserName = "小朱";
user.iAage = 24;
Session["CustomClass"] = user;
自定义类MyUser如下:
class MyUser
{
public string sUserName;
public int iAage;
public override string ToString()
{
return string.Format("姓名:{0},年龄:{1}", sUserName, iAage);
}
}
在这里,我们覆写了ToString()方法直接返回实例的一些信息。
(2)读取
if (Session["SimpleString"]==null)
{
Response.Write("读取简单字符串失败<br/>");
}
else
{
string s=Session["SimpleString"].ToString();
Response.Write(s + "<br/>");
}
if (Session["CustomClass"]==null)
{
Response.Write("读取简单自定义类失败<br/>");
}
else
{
MyUser user=Session["CustomClass"] as MyUser;
Response.Write(user.ToString()+"<br/>");
}
注意:在每次读取Session的值以前请务必先判断Session是否为空,否则很有可能出现“未将对象引用设置到对象的实例”的异常。我们看到,从Session中读出的数据都是object类型的,我们需要进行类型转化后才能使用。
(2)把Session存储在独立的进程中
写入Session
要把Session存储在Windows服务进程中需要进行以下几个步骤。
第1步是打开状态服务。依次打开“控制面板”→“管理工具”→“服务”命令,找到ASP.NET状态服务一项,右键单击服务选择启动,并修改服务为自启动
第2步,在system.web节点中加入:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="20"></sessionState>
第1步.在运行中输入regedit启动注册表编辑器。
第2步. 依次打HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters节点,双击Port选项,如图所示。
选择基数为十进制,然后输入一个端口号即可。stateNetworkTimeout属性表示从状态服务器请求Session数据最长的时间,默认为10秒,如果网络连接不是很好,请把这个数字适当设置得大一点。
由于只有把对象标注为可序列化后才能在服务中进行存储。什么是序列化呢?序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记。
[Serializable]
class MyUser
{
public string sUserName;
public int iAage;
public override string ToString()
{
return string.Format("姓名:{0},年龄:{1}", sUserName, iAage);
}
}