如题

解决方案 »

  1.   

    cookie 的客户端的东西,session问题应该让服务器端自己解决
      

  2.   

    对安全性要求高的用数据库 
    对效率要求高的用cookie
      

  3.   

    使用session前判断 如果失效的话 做相应的提示
      

  4.   

    最有效的是 更改web.config
     <system.web>
    <sessionState mode="StateServer" cookieless="false" timeout="20000"></sessionState>
    </system.web>
    个人意见asp中Session的工作原理:
    asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。asp.net Session的实现
    asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。原因1:
    bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失原因2:
    文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失原因3:
    似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开原因4:
    Session的时间设置是不是有问题,会不会因为超时造成丢失原因5:
    IE中的cookie数量限制(每个域20个cookie)可能导致session丢失原因6:
    使用web garden模式,且使用了InProc mode作为保存session的方式web.config 一变动session好像也要丢失解决丢失的经验
    1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
    2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
    3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
    4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
    5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失参考:
    [1] http://jinglecat.cnblogs.com/archive/2005/11/14/275587.aspx 
    [2] http://www.0dsf.com/bbs/dispbbs.asp?boardID=30&ID=6032&page=5 
    [3] http://spaces.msn.com/eparg/Blog/cns!1pnPgEC6RF6WtiSBWIHdc5qQ!447.entry 
    [4] http://jinlinc.cnblogs.com/archive/2005/11/29/287181.aspx 
    [5] http://blog.joycode.com/ghj/archive/2004/06/23/25521.aspx 
    [6] http://www.365base.com/Article/343/347/2005/2005091534671.html 引用using System.Web.SessionState;
      

  5.   

    放到ASP.NET SessionState服务当中最好1!!!
      

  6.   

    系统里面有没有用框架,去掉框架或改成Cookie
      

  7.   

    采用Session的方式缺点很多,服务器负担一重就会被移除,不如Cookie用起来灵活方便。
    你的问题:
    使Session失效:Session.Remove("Key");或者Session["Key"]=null;
    以上两种方式都可以使得Session失效不过你用的使用要判断if(Object.Equal(Session["Key"],null))
      

  8.   

    一、        引发 Session 丢失的几种原因动过手写代码的人都知道,Session 丢失是比较常见的事。以下是本人这几年所遇到的,能够引发 Session 丢失的原因,不敢说是百分百,丢失概率还是特别高的。错…,简直可以说是“相…当…”高哇 ^_^"1、    存放 Session 的电脑重启(废话,若这样都不丢,你神仙啊)2、    InProc 模式:aspnet_wp.exe 或 w3wp.exe 在“任务管理器”中或其它情况下导致其进程被终止运行。3、    InProc 模式:修改 .cs 文件后,编译了两次(只编译一次,有时不会丢失)4、    InProc 模式:修改了 Web.config5、    InProc 模式,Windows 2003 环境:应用程序池回收、停止后重启6、    InProc 模式:服务器上 bin 目录里的 .dll 文件被更新以上列举的都是 InProc 模式下,容易引发解析 ASP.NET 应用程序重置的原因。是不是觉得很窝火?之前我也有这种感觉,慢慢就习惯啦,再后来就干脆不用这种模式了。于是乎,就有了使用下列两种模式的尝试,现写出来与大家一起分享。二、        使用 StateServer 保存 SessionStateServer 模式的实质是,把Session 存放在一个单独的进程里,此进程独立于 aspnet_wp.exe 或 w3wp.exe 。启用此服务后,在“任务管理器”中可以看到一个名为 aspnet_state.exe 的进程,下面开始说明一下设置的具体步骤: 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 的服务端口一致 三、        将 Session 放入 SQLServer 保存SQLServer 模式就是,把Session 存放在 SQL Server 数据库里(注意不是 Oracle ,动动脚趾都能猜到原因啦),下面开始说明一下设置的具体步骤: 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、    建立连接数据库 ASPState 的用户,并为此用户授权(此步骤可跳过)进行此步的原因是:一是不想在 Web.config 中出现 sa 的密码;二是 tempdb 在数据库启动后仅保留 sa 一个帐号的使用权限,其余帐号的权限统统被清除,但保存 Session又需要用到此 DataBase; A)、运行 SQL Server 的企业管理器 → 展开数据库的安全性 → 右击“登录” → 新建“登录” → 输入“名称” → 选择 “SQL Server 身份验证” → 输入“密码” → 指定“数据库” → 点击“数据库访问” → 勾选 “ASPState” → 选中“db_owner”角色 → 点击“确定” → 再一次输入“密码” → 点击“确定” 后即可建立 ASPState 的用户(此处建立名为“SessionStateUser”,密码为“123456”的测试用户)        B)、运行 SQL Server 的企业管理器 → 展开“管理” → 展开“SQL Server 代理” → 右击“作业” → 点击“新建作业” → 输入 “名称”(此例为 GrantSessionUser ) → 点击标签 “步骤” → 新建 → 输入 “步骤名”(此例为 Grant01) → 选择数据库“tempdb” → 编写 SQL 脚本“exec sp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner' ”→ 确定 → 点击标签 “调度” → 新建 → 输入 “名称”(此例为 Start01 )→ 选择类型“SQL Server 代理启动时自动启动” → 确定 → 最后点击“确定”新增完毕    C)、也可运行以下脚本一次性搞定以上 A、B 两个步骤/******脚本开始******/      --新建数据库帐号 SessionStateUser ,默认登录 ASPStateEXEC sp_addlogin 'SessionStateUser', '123456', 'ASPState' use ASPState        --切换 DataBase       --将 SessionStateUser 授予 db_owner 的权限exec sp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner' use master            --切换 DataBase BEGIN TRANSACTION        /******声明变量******/            DECLARE @JobID BINARY(16)     DECLARE @ReturnCode INT       SELECT @ReturnCode = 0         -- 若没有,则添加作业的分类    IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1        EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'     -- 新建作业    EXECUTE @ReturnCode = msdb.dbo.sp_add_job   --调用存储过程 sp_add_job            @job_id = @JobID OUTPUT,           --将返回的 JobID,赋值给变量            @job_name = N'GrantSessionUser',   --作业名称            @owner_login_name = NULL,           --默认为当前用户所有            @description = null,            @category_name = N'[Uncategorized (Local)]',        --作业分类归属            @enabled = 1,                    --是否启用            @notify_level_email = 0,            @notify_level_page = 0,            @notify_level_netsend = 0,            @notify_level_eventlog = 0,            @delete_level= 0     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback --出错则回滚       -- 新建步骤    EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep --调用存储过程 sp_add_jobstep            @job_id = @JobID,                   --传入刚刚新建的 JobID            @step_id = 1,            @step_name = N'Grant01',         --步骤名称            @command = N'exec sp_adduser ''SessionStateUser'', ''SessionUser'' ,''db_owner''',             --需要执行的 SQL 脚本(注意用两个连续的单引号表示 SQL 中的单引号)             @database_name = N'tempdb', --执行上述 SQL 所用的 DataBase            @server = N'',            @database_user_name = N'',            @subsystem = N'TSQL',    --执行类型为“Transact-SQL 脚本”            @cmdexec_success_code = 0,            @flags = 0,            @retry_attempts = 0,            @retry_interval = 1,            @output_file_name = N'',            @on_success_step_id = 0,            @on_success_action = 1,            @on_fail_step_id = 0,            @on_fail_action = 2     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback       -- 新建调度    EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule            @job_id = @JobID,            @name = N'Start01',   --调度名称            @enabled = 1,            @freq_type = 64               --“64”表示 当 SQLServerAgent 服务启动时运行     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback       -- 将新建的作业添加到本地数据库    EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback       COMMIT TRANSACTION             GOTO   EndSave             QuitWithRollback:    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTIONEndSave:/******脚本结束******/ 4、    设置 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在此处的作用是清除数据库中已过期的 Sessionc)、你若跳过了第三步,则 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 的存取权限是行不滴。