ASP.NET 2.0 状态管理 学习笔记( 二)

SESSION

1.概述

Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息。举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少。
我们知道,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。

(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>

        stateConnectionString表示状态服务器的通信地址(IP:服务端口号)。由于我们现在在本机进行测试,这里设置成本机地址127.0.0.1。状态服务默认的监听端口为42422。当然,您也可以通过修改注册表来修改状态服务的端口号。
       第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);
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值