电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

Session共享的解决方案


发布日期:2024/1/8
 

客户端SessionID值唯一

对于不同的域名主域名子域名跨站点域名或跨服务器域名用户在打开页面时会产生不同的SessionID

为了使这些站点在用户登录时只登录一次那我们就要解决SessionID的问题必须使SessionID在这些共享Session的站点中只产生一次而SessionID是存储在客户端的cookie之中键值为ASPNET_SessionId的一个字符串(也可以存储在URL中这里不作使介绍)为此只须使各站点存储的SPNET_SessionId唯一即可

因每个客户端在打开时会产生一个SessionID为此我们要做的就是重置SessionID我们可以在继承HttpModule在结束请求时重写SessionID

代码如下

public class MakeSessionIDOneOnly : IHttpModule { private string m_RootDomain = stringEmpty; #region IHttpModule Members public void Dispose() { } public void Init(HttpApplication context) { m_RootDomain = ConfigurationManagerAppSettings[RootDomain]; Type stateServerSessionProvider = typeof(HttpSessionState)AssemblyGetType(SystemWebSessionStateOutOfProcSessionStateStore); FieldInfo uriField = stateServerSessionProviderGetField(s_uribase BindingFlagsStatic | BindingFlagsNonPublic); if (uriField == null) throw new ArgumentException(UriField was not found); uriFieldSetValue(null m_RootDomain); contextEndRequest += new SystemEventHandler(context_EndRequest); } void context_EndRequest(object sender SystemEventArgs e) { HttpApplication app = sender as HttpApplication; for (int i = ; i < appContextResponseCookiesCount; i++) { if (appContextResponseCookies[i]Name == ASPNET_SessionId) { appContextResponseCookies[i]Domain = m_RootDomain; } } } #endregion }

为使用以上代码须配置下面节点项

<httpModules>

<add name=节点名称 type=类名全称 程序集/>

</httpModules>

Session值的共享

配置sessionState置节点使用StateServer或SQLServer来实现Session共享

为实现跨服务器共享必须在nfig配置

<machineKey decryptionKey=FDBEBAEFEEAABFBF validationKey=FCADDFCDFDAEFFDEABFCDFEFFAAEBAEACBBDBDABBCEADCACBCC validation=SHA decryption=Auto/>

并且不同服务器上站点配置必须用相同的nfig各站点目录配置也要相同

使用StateServer

存储Session的服务器必须开启StateServerASPNET状态服务只有机器重起的情况下才导致Session丢失

<sessionState cookieless=false timeout= mode=StateServer stateConnectionString=tcpip=IpAddress:/>

若StateServer在本机存储则IpAddress为若StateServer为远程服务器则为IpAddress为远程服务器IP地址并且修改注册表项如下

Windows Registry Editor Version

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters]

Port=dword:ab

AllowRemoteConnection=dword:

使用SQLServer

必须开启SQLServer代理服务此服务负责清除过期的Session若没有开服务则Session不会过期

使用SQLServer在机器重启后Session不会丢失

nfig配置

<sessionState mode=SQLServer sqlConnectionString=server=DBIpAddress; uid=myid; pwd=mypwd;/>

数据库配置

使用aspnet_regsqlexe工具

ASPNET 版本后微软提供了aspnet_regsqlexe工具可以方便的配置Session数据库该工具位于 Web 服务器上的系统根目录\MicrosoftNET\Framework\版本号文件夹中

使用举例:

aspnet_regsqlexe S U sa P 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 选项包括自定义数据库的名称

sessionState参数说明

属性

说明

allowCustomSqlDatabase

可选的 Boolean 属性

指定会话状态 SQL 数据库是否可以是自定义数据库(而不是 ASPNET 默认数据库)如果为 false则不能指定初始目录或数据库作为 sqlConnectionString 属性的值默认会话状态 SQL 数据库为 ASPState 数据库有关更多信息请参见会话状态模式

此属性是 NET Framework 版中的新属性

默认值为 false

cookieless

可选的 HttpCookieMode 属性

指定对于 Web 应用程序使用 Cookie 的方式

cookieless 属性可以为下列可能值之一默认值为 UseCookies

说明

AutoDetect

ASPNET 确定请求浏览器或请求设备是否支持 Cookie如果请求浏览器或请求设备支持 Cookie则 AutoDetect 使用 Cookie 来保留用户数据否则将在查询字符串中使用一个标识符如果浏览器或设备支持 Cookie但当前禁用了 Cookie则请求功能仍会使用 Cookie

UseCookies

无论浏览器或设备是否支持 Cookie都使用 Cookie 来保留用户数据

UseDeviceProfile

ASPNET 根据 HttpBrowserCapabilities 设置来确定是否使用 Cookie如果 HttpBrowserCapabilities 设置指示浏览器或设备支持 Cookie将使用 Cookie否则将在查询字符串中使用一个标识符

UseUri

无论浏览器或设备是否支持 Cookie调用功能都使用查询字符串来存储标识符

cookieName

可选的 String 属性

指定存储会话标识符的 Cookie 的名称

此属性是 NET Framework 版中的新属性

默认值为 ASPNET_SessionId

customProvider

可选的 String 属性

指定用于存储和检索会话状态数据的自定义会话状态提供程序的名称该提供程序在 providers 元素中指定仅当会话状态模式设置为 Custom 值时才使用该提供程序有关更多信息请参见会话状态模式

此属性是 NET Framework 版中的新属性

默认值为空字符串 ()

mode

可选的 SessionStateMode 属性

指定存储会话状态值的位置有关更多信息请参见会话状态模式

mode 属性可以为下列可能值之一默认值为 InProc

说明

Custom

会话状态将使用自定义数据存储区来存储会话状态信息

InProc

会话处于正在处理 ASPNET 辅助进程的状态

Off

会话状态被禁用

SQLServer

会话状态将使用进程外 SQL Server 数据库来存储状态信息

StateServer

会话状态将使用进程外 ASPNET 状态服务来存储状态信息

partitionResolverType

可选的 String 属性

指定在哪里存储会话状态如果 partitionResolverType 属性中指定了值则忽略 sqlConnectionString 和 stateConnectionString 属性PartitionResolverType 属性返回的连接字符串将用于每个请求为请求的其余部分连接到适当的服务器位置如果连接字符串无效ASPNET 将引发一个异常该异常与当配置的服务器连接字符串无效时引发的异常相同该属性用于在 SQL 或状态服务器模式下在多个后端节点上划分会话状态数据

此属性是 NET Framework 版中的新属性

默认值为空字符串

regenerateExpiredSessionId

可选的 Boolean 属性

指定当客户端指定了过期的会话 ID 时是否重新发出会话 ID默认情况下当启用了 regenerateExpiredSessionId 时仅为 cookieless 模式重新发出会话 ID有关更多信息请参见 IsCookieless

此属性是 NET Framework 版中的新属性

默认值为 true

sqlCommandTimeout

可选的 TimeSpan 属性

指定使用 SQL Server 会话状态模式的 SQL 命令的持续时间超时(秒)持续时间超时是 SQL 命令可以处于空闲状态的时间(秒)超过此时间之后该命令将被取消

此属性是 NET Framework 版中的新属性

默认值为 :: 秒)

sqlConnectionString

可选的 String 属性

为运行 SQL Server 的计算机指定连接字符串该属性在 mode 属性设置为 SQLServer 值时是必需的有关更多信息请参见会话状态模式

注意

若要在使用 SQLServer 模式时提高您的应用程序的安全性请使用受保护的配置来加密配置的 sessionState 节以帮助保护 sqlConnectionString 值

默认值为 data source=;Integrated Security=SSPI

stateConnectionString

可选的 String 属性

指定远程存储会话状态的服务器名称或地址以及端口端口值必须为 当 mode 为 StateServer 值时该属性是必需的确保运行 ASPNET 状态服务的服务器是存储会话状态信息的远程服务器该服务随 ASPNET 一起安装默认情况下为 %SystemRoot%\MicrosoftNET\Framework\VersionNumber\aspnet_stateexe有关更多信息请参见会话状态模式

注意

若要在使用 StateServer 模式时提高您的应用程序的安全性请使用受保护的配置来加密配置的 <sessionState> 节以帮助保护 stateConnectionString 值

默认值为 tcpip=:

stateNetworkTimeout

可选的 TimeSpan 属性

指定 Web 服务器与状态服务器之间的 TCP/IP 网络连接可以处于空闲状态的时间(秒)超过此时间后请求将被取消该属性在 mode 属性设置为 StateServer 值时使用

默认值为

timeout

可选的 TimeSpan 属性

指定在放弃一个会话前该会话可以处于空闲状态的分钟数对于进程内和状态服务器模式timeout 属性不能设置为大于 分钟( 年)的值

会话 timeout 配置设置仅适用于 ASPNET 页更改会话 timeout 值不会影响 ASP 页的会话超时时间同样更改 ASP 页的会话超时时间不会影响 ASPNET 页的会话超时时间

默认值为 分钟

useHostingIdentity

可选的 Boolean 属性

指定会话状态将恢复为宿主标识还是使用客户端模拟

如果为 trueASPNET 将使用下列进程凭据之一来连接会话状态存储区

宿主进程对于 Microsoft Internet 信息服务 [IIS] 版为 ASPNET对于 Microsoft Windows Server 则为 NETWORK SERVICE

应用程序模拟标识当使用了以下配置时使用此凭据

<identity impersonate=true userName=user password=pwd />

如果为 falseASPNET 将使用目前与当前请求的操作系统线程关联的凭据来连接会话状态存储区对于客户端模拟ASPNET 将使用与浏览器协商的安全凭据来连接会话状态存储区如果为 falseASPNET 在连接会话状态存储区时不会恢复为进程标识或应用程序模拟标识有关更多信息请参见 ASPNET 模拟

此属性是 NET Framework 版中的新属性

默认值为 true

注意

NET Framework 版中如果 mode 属性设置为 SQLServer并且客户端模拟有效则 ASPNET 使用来自 ASPNET 客户端模拟的客户端凭据连接到运行 SQL Server 的计算机

继承的属性

可选的属性

由所有节元素继承的属性

上一篇:学好基本功之熟练调用 Web Service

下一篇:正则表达式编程Regex类用法