zoukankan      html  css  js  c++  java
  • ASP.NET中的session模式2

    一、写在前面

      我们在使用ASP.NET开发的过程中,有时会进行数据存储以实现请求前后的状态保持(HTTP是无状态保持的协议),而Session作为一种快速简单易于实现的方式被我们经常使用,当然如果出于性能方面的考量,我们还是不建议往Seesion中塞入更多的东西,最好是不用Session。

      还有一点需要说明的是,Session实现的本质是在客户端产生一个SessionId,具体的数据存储在服务器端,客户端通过SessionId来获取服务器端的具体数据,那这个SeesionId是怎么保存在客户端以及又是以什么方式来传给服务器的呢?服务器端又是以什么方式保存Session的这些数据的呢?各种方式的优缺点又是什么?这就是本篇随笔想要记录的内容。

    二、实现方式

        <sessionState mode="Off|InProc|StateServer|SQLServer" 
                  cookieless="true|false" 
                  timeout="number of minutes" 
                  stateConnectionString="tcpip=server:port" 
                  sqlConnectionString="sql connection string" 
                  stateNetworkTimeout="number of seconds" /> 

    上面是Session在Web.config的配置方式,下面对各个节点做一些简单的介绍

    mode(设置将服务器的Session信息存储到哪里)

    • Off表示设置为不使用Session功能;
    • InProc表示将Session存储在进程内,这也是ASP中的存储方式,这是默认值;
    • StateServer表示将Session存储在独立的状态服务即ASP.NET State Service中;
    • SQLServer表示将Session存储在SQL Server。

    cookieless(设置客户端的Session信息存储到哪里)

    • true表示使用Cookieless模式(这表明SessionId将不再使用Cookie存储了,而是将其通过URL存储);
    • false表示使用Cookie模式,这是默认值。

    从上面的设置配置中我们也可以发现Session和Cookie的关系:

    • 首先Session在客户端的实现肯定是SessionId;
    • 默认这个SessionId是通过Cookie存储的(比较安全);
    • 当然也可以通过URL来进行存储,这样Session和Cookie就没有关系了,但是此种方式由于受URL长度限制以及明文传送导致不安全而不被推荐使用。

    timeout

    Session过期时间设置,默认为20分钟。

    stateConnectionString

    如果设置将Session信息存储在State Server中时,则需要此配置字符串表明服务器名称和端口。

    sqlConnectionString

    如果设置将Session信息存储在SQL Server中,需此配置,表明数据库的连接字符串,同时stateNetworkTimeout表明经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

    三、Session服务器端配置

    1. InProc

      顾名思义,此种模式表示Session将会被保存在内存中,确切地说是保存在工作者进程中,对于IIS 5而言是aspnet_wp.exe,对于IIS 6而言是w3wp.exe,设置方式如下(Web.config)

    <sessionState mode="InProc" cookieless="false" timeout="20"/>

    由于是直接保存在进程中,所以性能最好,但是经常会发生Session信息丢失,常见的导致进程重启的可能情况为:

    • 配置文件中processModel标签的memoryLimit属性;
    • Global.asax或者Web.config文件被更改;
    • Bin文件夹中的Web程序(DLL)被修改;
    • 杀毒软件扫描了一些.config文件;
    • 系统资源紧张进行资源回收导致IIS进程崩溃或重启等。
    • 更多信息请参阅http://support.microsoft.com/kb/316148

    2. State Server

      此种方式是将Session信息存储在其它的进程中而不是IIS中,这样就可以避免因IIS进程崩溃或重启而导致的Session信息丢失。但是此种方式要求保存在Session的信息必须序列化,然后从Session中获取的时候也要反序列化,这就导致性能有略微的损失。

    <sessionState mode="StateServer" cookieless="false" timeout="20"/>

      StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请把该服务的启动模式设置为自动(这样下次服务就可以随机器而启动)并手工将该服务启动运行。这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的。

    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20"/>

      此种配置和上面是一样的(多了个stateConnectionString,换句话说127.0.0.1是默认本机IP,42424默认是该服务的访问端口号,写不写效果是一样的),都表示StateServer是在本机(注:StateServer模式是支持远程主机服务的,配置类似与下面)

    <sessionState mode="StateServer" stateConnectionString="tcpip=10.7.10.87:42424" cookieless="false" timeout="20"/>

      注:如果在启动ASP.NET State Service服务时遇到问题0x8007277a 即无法启动或初始化,请尝试在命令行(CMD)中输入netsh winsock reset(有可能是winsock的问题,所以需reset一下)

    3. SQL Server

      此种方式是把Session信息保存在SQL Server的数据库中,也需要序列化,性能有较大损失,但是Session一般不会发生丢失的情况,除非SQL Server宕机。而且此种方式也可以实现在Web Farm中的Session信息共享(上面两种方式都不可以)。

    <sessionState mode="SQLServer" sqlConnectionString ="data source=10.7.11.114; user id=lms_session; password=LmsSession@2012" timeout="20" />

    3.1 安装ASPState数据库

    在使用之前,我们要安装配置对应的数据库,而微软给我们提供了一整套方案(你也可以选择使用自己的数据库或自己实现配置和管理)。ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库,该工具位于 Web 服务器上的"系统根目录\Microsoft.NET\Framework\版本号"文件夹中.

    使用举例:

    aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p

    -S参数:

    表示数据库实例名称. 可以用"."表示本机.

    -U和-P参数:

    表示用户名和密码.

    -E参数:

    可以再-U –P 与 -E中选择一组. –E表示以当前系统用户通过windows身份验证登录数据库, -U -P则是使用SqlServer用户登录数据库.

    -ssadd / –ssremove 参数:

    -ssadd表示是添加Session数据库, -ssremove表示移除Session数据库.

    sstype 参数:

    选项

    说明

    t

    将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。

    p

    将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。

    c

    将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。

    注意:如果sstype为t,则在下面的用户权限赋予中要授予对tempdb的dbowner权限,否则将无法操作数据库。

    3.2 建立连接数据库 ASPState 的用户,并为此用户授权

      运行 SQL Server 的企业管理器 → 展开数据库的安全性 → 右击“登录” → 新建“登录” → 输入“名称” → 选择 “SQL Server 身份验证” → 输入“密码” → 指定“数据库” → 点击“数据库访问” → 勾选 “ASPState” → 选中“db_owner”角色 → 点击“确定” → 再一次输入“密码” → 点击“确定” 后即可建立 ASPState 的用户,下面用命令实现:

    --新建数据库帐号 SessionStateUser ,默认登录 ASPState
    EXEC sp_addlogin 'SessionStateUser', '123456', 'ASPState'

    use ASPState --切换 DataBase

    --将 SessionStateUser 授予 db_owner 的权限
    exec sp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner'

    3.3 启动SQL Server Agent

      自动运行Job ASPState_Job_DeleteExpiredSessions删除过期的Session,否则数据库中的数据将一直增长。

  • 相关阅读:
    模型绑定
    Asp.Net MVC基础
    Entity Framework 6.x介绍
    IE内核发送ajax请求时不会将url中的参数编码
    .NET使用OpenSSL生成的pem密钥文件[1024位]
    简单测试nginx1.90做TCP协议负载均衡的功能
    《图解TCP/IP》读书笔记
    使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)
    wireshark常用的过滤器设置
    通过监控线程状态来保证socket服务器的稳定运行
  • 原文地址:https://www.cnblogs.com/yunfeiqi/p/3016360.html
Copyright © 2011-2022 走看看