日期:2014-05-20  浏览次数:20477 次

急!Session在部分用户登录时丢失的问题!
同一用户名在不同机器上

在登录成功后给Session[ "LoginUser "]赋了值

但在另一个页面的DLL中调用HttpContext.Current.Session[ "LoginUser "].ToString();有时为空,有时又能取出来,why?

------解决方案--------------------
你在调试的时候,session的时间不能保证,有时很快就消失
------解决方案--------------------
在asp.net2.0中,session是依附于IIS进程的,但是IIS不稳定,会经常重启,导致SESSION丢失,建议采用依附于ASP.NET STATE进程,这个在IIS》属性》ASP.NET中修改,另外,把系统服务中的ASP.NET STATE服务打开
------解决方案--------------------
我想可能是登录了,而重新编译后再刷新页面,重启IIS或者重新编译网站,都会导致所有Application和Session消失
Session也是独立于IE进程的,新开一个IE窗口来访问该网站,网站服务器就会新开一个Session,那个窗口登录了,另外的窗口还是没登录的
要解决这种问题,都用Cookies来解决的
------解决方案--------------------
使用 StateServer 保存 Session
1、 修改注册表(关键步骤,如下图)
运行 regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许,0 代表禁止)→ 设置 Port (端口号)
注意事项:
a)、若ASP.NET State Service 正在运行,修改注册表内容后,则需要重新启动该服务
b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424 是默认的端口
c)、AllowRemoteConnection 的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的ASP.NET State Service,即把 Session 存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString 为“tcpip=localhost: 42424”与“tcpip=127.0.0.1:42424”的情况,方可使用ASP.NET State Service
2、 开启 ASP.NET State Service(如下图)
右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 双击“ASP.NET State Service” → 启动(可设为“自动”)
说明:只要安装了 .Net Framework v1.0/v1.1 ,都拥有此服务。
3、 更改 Web.config
打开 Web.config → 找到 <sessionState> 节点内容
<sessionState
mode= "InProc "

stateConnectionString= "tcpip=127.0.0.1:42424 "

sqlConnectionString= "data source=127.0.0.1;Trusted_Connection=yes "

cookieless= "false "

timeout= "20 " />
→ 将其改为以下内容

<sessionState mode= "StateServer " stateConnectionString= "tcpip=192.168.0.2:42424 " timeout= "20 " />

注意事项:
a)、设成StateServer 后,必须要有对应的stateConnectionString
b)、注意 IP 地址(可以是远程计算机 IP、计算机名称、域名)与端口号,端口号需与ASP.NET State Service 的服务端口一致




------解决方案--------------------
是不是对bin文件夹进行文件保存了
------解决方案--------------------
最简单的解决办法是加内存
内存压力造成的
最有效的办法是使用 StateServer 保存 Session
------解决方案--------------------
或者将 Session 放入 SQLServer 保存
1、 启动相关的数据库服务(如图)
运行SQL Server 服务管理器 → 启动 SQL Server (最好设为开机自动运行) → 启动 SQL Server Agent 服务(最好设为开机自动运行)
注意事项:
a)、注意启动顺序,也可通过下列方式设置: 右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 找到“MSSQLSERVER”与“SQLSERVERAGENT” → 启动并设置启动类型为“自动”
b)、SQL Server Agent在此处的作用是清除数据库中已过期的 Session
2、 建立存放 Session 的 DataBase
运行“SQL 查询分析器”→ 使用“sa”或是拥有“master”的 db_owner 权限的用户登录数据库 → 打开查询文件 C:\WINNT\Microsoft.NET\Framework\v1.1.4322\InstallSqlState.sql (存放在 Windows 系统目录的 .Net 安装目录下可找到) → 直接运行该 sql 脚本 → 刷新数据库即可看到名为 ASPState 的 DataBase

3.设置 Web.config 内容
打开 Web.config → 找到 <sessionState> 节点内容 → 修改为以下内容即可:
<sessionState mode= "SQLServer " sqlConnectionString = "data source=192.168.0.2; user id= SessionStateUser; password=123456 " timeout= "20 " />
注意事项:
a)、sqlConnectionString 中不能出现 initial catalog 选项
b)、SQL Server Agent在此处的作用是清除数据库中已过期的 Session
c)user id 需要用 sa 进行登录
d)、若sqlConnectionString 为 “data source=127.0.0.1;Trusted_Connection=yes”,则使用本地计算机ASPNET(Windows 2000 系统帐户)或 Network Service(Windows 2003 系统帐户)的身份登录数据库。要是数据库不允许上述用户登录,则报错;同样,即使上述帐户能成功登录,也要分配其 tempdb 的权限,理由是 Session 是保存在 tempdb 中的,若没有该 DataBase 的存取权限是行不滴。