zoukankan      html  css  js  c++  java
  • SessionState的几种设置

     

      web Form 网页是基于HTTP的,它们没有状态, 这意味着它们不知道所有的请求是否来自
    同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造成信息的
    丢失。 于是, 状态管理就成了开发网络应用程序的一个实实在在的问题。
    在ASP中能够通过Cookie 、查询字符串、 应用程序、会话(Session) 等轻易解决这些问题。
    现在在ASP.NET环境中,我们依然可以使用这些功能,并且功能更加强大。
    状态管理分为服务端和客户端两种情况, 这里只是介绍 服务端状态管理:

    与Application对象不同的是, ASP.NET 的Session对象可以在IIS服务器或者工作进程重新启动时
    恢复启动前的状态而不丢失其中的数据。这是因为存储在Session中的所以信息都缺省的存储在
    一个作为Windows服务运行的状态服务器进程中。状态可以被序列化并以二进制形式保存在内存中。
    程序员可以悬着使用Microsoft Sql server数据库来存储数据。

    状态服务器服务和状态信息可以和web应用程序一起存在于同一台服务器上,也可以保存到外部的
    状态服务器上。 为了指定如何存储信息,程序员可以在web.config文件中编写适当的配置。

    ASP.NET会话状态模块在Web.config文件中<System.web>标记下的<Sessionstate>标记的mode属性来决定
    该属性的四种可能的值: Off、 Inproc StateServer 和SQLserver。

    1 Inproc是缺省的设置

    它允许“无Cookie”的会话,以及在服务器之外存储
    会话数据。ASP.NET会话状态模块在Web.config文件中像下面这样配置:

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

    在这个例子中,mode属性设为InProc(默认值),表明会话状态要由ASP.NET存储到内存中,而且
    不用Cookie来传递会话ID。相反,会话ID要直接插入一个网页URL的查询字符串中。例如,采用
    InProc模式并建立一个会话之后,调用一个假想的ASP.NET网页时,需要采用下面这样的URL:

    http://my.website.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx

    圆括号中长长的字母、数字字符串就是会话ID。ASP.NET引擎从查询字符中提取会话ID,并将用户
    请求与特定会话联系起来。采取这种方式,不管Cookie还是隐藏表单字段都用不着了。
    所以,即使网页中没有使用表单,也能加入会话。

    但是这种方法,应用程序的状态将依赖于 ASP.NET进程,当IIS进程崩溃或者正常重启时,保存在
    进程中的状态将丢失。


    2 mode属性设为Off

    和从前的ASP一样,ASP.NET的会话状态管理是要产生开销的。所以,假如某个网页不需要访问
    Session对象,开发者应将那个页的Page预编译指令的EnableSessionState属性设为False。
    要为整个网站禁用会话状态,可在Web.config文件中将sessionState元素的mode属性设为Off。

    为了克服inproc 模式的缺点, ASP.NET 提供了两种进程外保存会话状态的方法。

    3 StateServer会话管理

    将mode属性设为StateServer,也就是将会话数据存储到单独的内存缓冲区中,再由单独一台机器上运行

    的Windows服务来控制这个缓冲区。状态服务全称是“ASP.NET State Service ”(aspnet_state.exe),

    它由Web.config文件中的stateConnectionString属性来配置。该属性指定了服务所在的服务器,以及要监

    视的端口:
    <sessionState mode="StateServer"
    stateConnectionString="tcpip=myserver:42424"
    cookieless="false" timeout="20" />

    在这个例子中,状态服务在一台名为myserver的机器的42424端口(默认端口)运行。要在服务器上改变

    端口,可编辑HKLMSYSTEMCurrentControlSetServicesaspnet_state注册表项中的Port值。

    显然,使用状态服务的优点在于进程隔离,并可在Web farm中共享。 使用这种模式,会话状态的存储将不

    依赖于iis进程的失败或者重启,然而,一旦状态服务中止,所有会话数据都会丢失。换言之,状态服务不

    像SQL Server那样能持久存储数据;它只是将数据存储在内存中。


    4 用SQL Server进行会话管理

    ASP.NET还允许将会话数据存储到一个数据库服务器中,方法是将mode属性变成SqlServer。
    在这种情况下,ASP.NET尝试将会话数据存储到由sqlConnectionString属性(其中包含数据源以及登录服

    务器所需的安全凭证)指定的SQL Server中。
    为了用恰当的数据库对象来配置SQL erver,管理员还需要创建ASPState数据库,
    方法是运行WinDirMicrosoft.NetFrameworkVersion文件夹中的InstallState.sql脚本(WinDir是服务

    器的Windows文件夹,而Version是你使用的.NET框架版本的安装文件夹)。
    要配置SQL服务器,可以在命令行中运行SQL Server 提供的命令行工具osql.exe

    osql -S [ server name] -U [user] -P [password] <InstallSqlState.sql
    例如
    osql -S (local)NetSDK -U sa -P "" -i InstallSqlState.sql

    在这里用户名必须是SQL服务器上的sa帐号,或者具有同等权限的其他帐号。有兴趣的读者可以打开
    这个脚本文件来了解ASP.NET是如何和SQL Server配合实现状态管理的。

    卸载这些表和存储过程,可以使用UninstallSqlState.sql脚本,使用方法与上面类似。

    做好必要的数据库准备工作后,将web.config 文件中的sessionstate 元素的mode改为"sqlserver"
    ,并且指定SQL连接字符串。具体如下:

    mode="sqlserver"
    sqlConnectionString="data source=127.0.0.1; userid=sa; password="

    配置好SQL Server后,应用程序代码运行时就和InProc模式没有什么区别。但要注意的是,由于数据不存

    储在本地内存,所以存储会话状态的对象需要进行序列化和反序列化,以便通过网络传给数据库服务器,

    以及从数据库服务器传回。这当然会影响性能。通过在数据库中存储会话状态,可分别针对扩展性及可靠

    性来有效地平衡性能。另外,可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,
    这样就可以为应用程序提供极大限度的可靠性。

  • 相关阅读:
    Oracle 按一行里某个字段里的值分割成多行进行展示
    Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by
    SpringBoot 项目启动 Failed to convert value of type 'java.lang.String' to required type 'cn.com.goldenwater.dcproj.dao.TacPageOfficePblmListDao';
    Maven 设置阿里镜像
    JS 日期格式化,留作参考
    JS 过滤数组里对象的某个属性
    原生JS实现简单富文本编辑器2
    Chrome控制台使用详解
    android权限(permission)大全
    不借助第三方网站四步实现手机网站转安卓APP
  • 原文地址:https://www.cnblogs.com/hzz521/p/6865824.html
Copyright © 2011-2022 走看看