Session服务器配置指南与使用经验的深入解析

一.摘要 装有Web程序都会使用Session保存数据.
使用独立的Session服务器能够消除负载均衡场景中的Session分享难题.本文介绍.NET平台下树立Session服务器的三种艺术,
并介绍在利用Session时的各个经历和技艺.

二.关于Session,SessionID和Cookies
Session数据保存在劳动器端, 然则每一个客户端都亟需保留一个SessionID,
SessionID保存在Cookies中, 关闭浏览器时过期.

在向服务器发送的HTTP央求中会包括SessionID,
服务器端依照SessionID获取获取此用户的Session音信.
无数低端开采职员不清楚SessionID和Cookies的关联,
所以常常感到彼此没有联系. 那是不科学的.
便是因为SessionID保存在Cookies中,
所以在我们保留Cookies的时候,必须要专注不要因为Cookies的分寸和个数难点而招致SessionID对象.
在我们的主次中, 对SessionID的Cookies有新鲜的拍卖:

复制代码 代码如下:

      /// <summary>
        /// 写入cookie.
        /// </summary>
        /// <param name=”day”></param>
        /// <returns></returns>
        public bool SetCookie(int day)
        {
            string CookieName = GetType().ToString();
            HttpCookie SessionCookie = null;
            //对 SessionId 进行备份.
            if
(HttpContext.Current.Request.Cookies[“ASP.NET_SessionId”] != null)
            {
                string SesssionId =
HttpContext.Current.Request.Cookies[“ASP.NET_SessionId”].Value.ToString();
                SessionCookie = new HttpCookie(“ASP.NET_SessionId”);
                SessionCookie.Value = SesssionId;
            }           
//省略掉中间的代码部分.只保留备份SessionID和找回SessionID的逻辑           
            //假设cookie总的数量超越20 个, 重写ASP.NET_SessionId,
以防Session 丢失.
            if (HttpContext.Current.Request.Cookies.Count > 20 &&
SessionCookie != null)
            {
                if (SessionCookie.Value != string.Empty)
                {       
                   
HttpContext.Current.Response.Cookies.Remove(“ASP.NET_SessionId”);
                   
HttpContext.Current.Response.Cookies.Add(SessionCookie);
                }
            }
            return true;
        }

三.搭建Session服务器的两种形式 将Session保存在单身的服务器中得以兑未来多台Web服务器之间分享Session.就算我们也得以和睦支付Session存款和储蓄系统,
然则利用ASP.NET自带的囤积机制将进一步便捷.
.NET提供了5种保存Seission的方式:

方式名称

存储方式 性能

Off

设置为不使用Session功能

InProc

设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。

性能最高

StateServer

设置为将Session存储在独立的状态服务中。通常是aspnet_state.exe进程.

性能损失10-15%

SQLServer

设置将Session存储在SQL Server中。

性能损失10-20%

Customer

自定制的存储方案

由实现方式确定

大家得以在Web.Config中布局程序行使的Session存款和储蓄方式.暗中同意意况下是InProc,
即保存在IIS进程中. 关于Off, InProc和Customer本文不做疏解.
相关作品大家都可以在互连网查找到.
上面首要教师 StateServer 和 SQLServer 的应用.

四.使用 StateServer 形式搭建Session服务器
(1)服务器端配置
1.伊始 Asp.net State
service服务.(那几个服务默许的情景为手动.修改为电动并运行.)
2.修改注册表:
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters]
设置 AllowRemoteConnection = 1 , 设置 Port = 42424
(十进制,暗许即为42424)
Port是劳务的端口号
AllowRemoteConnection
表示是还是不是同意任何机器连接,0为仅能本机使用,1为能够供其余机器使用.

(2)客户端设置
在Web应用程序的Web.Config中, 大家要求修改 <configuration> /
<system.web> 的<sessionState>节点.如果未有
不曾则拉长(私下认可使用的是InProc情势)

复制代码 代码如下:

<sessionState
mode=”StateServer”
stateConnectionString=”tcpip=服务器ip:42424″
cookieless=”false”
timeout=”60″/>

下面的参数咱们能够凭借必要修改.

五.用到SqlServer情势搭建Session服务器
(1)服务器端配置
动用SqlServer情势搭建Session服务器端有两种格局. ASP.NET
1.0和1.1本子请使用方式a, 2.0即以上版本请使用方法b.

a.使用SQL文件成立Session数据库
在ASP.NET 1.0和1.1 版本中,
只可以利用这种形式.对于2.0及其以上版本,请使用aspnet_regsql.exe工具.(当然此措施也通用2.0本子)
.net提供了数据库安装脚本,能够在机器的windows文件夹中找到:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
InstallSqlState.sql
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
InstallSqlStateTemplate.sql
基于ASP.NET的版本分化, 必要利用差别的SQL脚本.
ASP.NET首要有1.1和2.0八个版本,能够在区别的版本文件夹找到那五个SQL.
InstallSqlState.sql
是创办暗中同意名称的数据库”[ASPState]”.此SQL能够直接运维.
InstallSqlStateTemplate.sql
可以运用本身内定的数据库保存数据.此SQL须要本身修改后运维,
展开SQL文件将里面 [DatabaseNamePlaceHolder]
替换为和煦钦点的数据库名称.
推行installsqlstate.sql时没有要求钦点数据库,能够在放肆数据库上实施.此SQL会融洽成立新的数据库

b. 使用aspnet_regsql.exe工具
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 选项包括自定义数据库的名称。

(2)Session客户端设置 此房是同等必要Web应用程序修改Web.Config中的<sessionState>节点.假设使用暗许的数据库(ASPState库),
则配置如下:

复制代码 代码如下:

 <sessionState
      mode=”SQLServer”
      sqlConnectionString=”server=192.168.9.151; uid=sa; pwd=123456;”
      />

比方应用了自定义的数据库名称,则还索要制订allowCustomSqlDatabase属性并在数据库连接串中钦定数据库:

复制代码 代码如下:

<sessionState
      mode=”SQLServer”
      allowCustomSqlDatabase=”true”
      sqlConnectionString=”server=192.168.9.151;
DataBase=MyAspState;uid=sa; pwd=123456;”
      />

六.选用经验与技巧总计 下面是SessionID, Session_End时间, StatServer情势 和
SqlServer情势的各样经历和技艺计算.
(1)StateServer模式: 1.在web farm中,请确认在全部的web服务器上有同样的<machineKey>

  1. 要封存在Session中的对象是可种类化的。
    3.为了在web farm中的分化web服务器上保障session state,IIS
    Metabase中的网站应用程序路线(如\LM\W3SVC\2)应该在具备的服务器上保持一致(大小写敏感).
  2. ASP.NET处理Session是在Machine.Config中布署的HttpModuel模块,
    在.NET的装置目录下的Config文件夹中,
    查看Web.Config(1.1本子是在Machine.Config):

复制代码 代码如下:

       <httpModules>
            …            <add name=”Session”
type=”System.Web.SessionState.SessionStateModule”/>
            …        </httpModules>

认可此模块是还是不是存在.
5.StateServer不援助负载均衡, 所以假设大出现推荐使用SqlServer方式,
可以享受到SqlServer的高质量和安全性.纵然存款和储蓄效用会有下落.
6.索要让具有机器的MachineKey同样.在Machine.Config中布局:

复制代码 代码如下:

<machineKey
validationKey=”1234567890123456789012345678901234567890AAAAAAAAAA”
decryptionKey=”123456789012345678901234567890123456789012345678″
validation=”SHA1″
decryption=”Auto”
/>

(2)SqlServer模式: 1. 要保存在Session中的对象是可种类化的。

  1. 举个例子采纳了暗中同意是数据库,
    则在客户端配置文件中的数据库链接字符串的用户,供给有所ASPState和tempdb四个库的dbowner权限.
  2. 在SQLServer情势下,session过期是由SQL
    Agent使用贰个挂号任务成功的,要确认SQL
    Agent已经运营。否则不可能清理超时的Session数据,
    会导致数据库数据直接扩展.
  3. 假如选用SqlServer格局时, 对于Web场中的各服务器的 ASP.NET
    应用程序路径必须是同等的。请在 IIS 配置数据库中对 Web 场中的全部 Web
    服务器举行 Web 站点的应用程序路线同步。大小写绝对要一致,因为 Web
    站点的应用程序路线是分别轻重缓急写的。
    5.索要让具有机器的MachineKey一样.在Machine.Config中布置:

复制代码 代码如下:

<machineKey
validationKey=”1234567890123456789012345678901234567890AAAAAAAAAA”
decryptionKey=”123456789012345678901234567890123456789012345678″
validation=”SHA1″
decryption=”Auto”
/>

(3)Session: 1. 不可能从来通过Session服务器在ASP.NET和ASP之间分享Session.
请使用微软提供的减轻方案:

  1. 在差异的应用程序或三个网址的不一致设想目录之间非常的小概分享Session
  2. Session的晚点时间是滑动时间.
  3. Session存款和储蓄.NET自带的值类型质量最优. 存款和储蓄对象会减少品质.
    (4)SessionID: 1.SessionID 还是能保存在U安德拉L上,
    设置Web.Config文件中的System.Web/sessionState节点的Cookiesless属性就可以:

复制代码 代码如下:

 <sessionState
      cookieless=”UseUri”
      />

  1. 诚如在Session超时或删除之后,SessionID保持不改变.
    因为Session过期后会在服务器端清除数据, 不过SessionID保存在用户浏览器上,
    所以只要浏览器不安歇则HTTP头中的SessionID保持不改变.
    3.苏息浏览器后再拜望, SessionID会区别.
    4.每展开三个IE6窗口, SessionID都不一致,
    在IE6中多少个窗口的Session不可能分享.
    5.FireFox的标签页和新的FireFox窗口, SessionID都一致,
    在FF的窗口和标签页上Session能分享.
    6.对于包括FrameSet的页面,举例:

复制代码 代码如下:

<frameset cols=”25%,50%,25%”>
  <frame src=”SessionID.aspx”>
  <frame src=”SessionID.aspx”>
  <frame src=”SessionID.aspx”>
</frameset>

一经后缀名是.htm並且.htm文件未有付诸ASP.NET的ISAPI管理,
那么依照服务器速度在各种Frame页目生成差异的SessionID,
再刷新后同样都非常最终八个SessionID.
化解办法是将.htm后缀改成.aspx, 大概将.htm文件提交ASP.NET的ISAPI处理. 
(5)Session_End事件: 1. Session_End仅在InProc情势中可用
2.
休憩浏览器,Session_End是不会接触的。HTTP是一种无状态协议,服务器并未有主意知道您的浏览器是或不是业已破产。
3.
当Session因为日子过期或调用Session.Abandon时,Session_End才会触发.Session.Clear()仅仅是解决数据,但不曾删除session。

  1. Session_End由四个后台线程触发,使用劳力经过账号运转.
    所以程序不会通报发出的错误.
  2. 在Session_End访谈数据库要思索权限难题.
    Session_End是用运维工小编经过(aspnet_wp.exe)的帐号运营的,那些账号能够在machine.config中钦点。因而,在Session_End中,假诺运用integrity
    security连接SQL,它将运用劳力经过账号身份连接,那说不定会孳生登陆失利.
    6.因为Session_End是有单独线程出发的,
    所以在Session_End中无法使用HttpContext对象(Request,Response,Server等目的都在HttpContext中), 
    即非常的小概利用 Response.Redirect 和Server.Transfer等方法.

七.总结 本身曾经应用SqlServer格局对商厦的多台服务器实现了Session共享,
服务重视启也不会导致用户预约进程重新开端(预订进程须要的Session不会抛弃). 
希望本文对现实的Session服务器搭建职员具有辅助. 

您或者感兴趣的篇章:

  • 深深Memcache的Session数据的多服务器分享详解
  • IIS服务器中 ASP.NET State Service 开启后 Session
    仍轻便遗失的标题终极消除办法
  • asp.net页面状态管理cookie和服务器状态管理Session
  • PHP 实现多服务器分享 SESSION
    数据
  • PHP达成多服务器session共享之NFS分享的不二等秘书籍
  • 用PHP达成多服务器共享SESSION数据的方法
  • 多php服务器完结多session并发运营

相关文章