当前位置: 澳门新濠3559 > 数据库 > 正文

这时我们可以使用url的方式来存储客户端Session,

时间:2019-11-22 23:13来源:数据库
一般情况下,我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值:InProc StateServer SQLServer“InProc”表示我们使用传统ASP一样的方法储存Session的值,而且“Stat

一般情况下,我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值: InProc StateServer SQLServer “InProc”表示我们使用传统ASP一样的方法储存Session的值,而且“StateServer”则表示使用另外一台主机来储存Session的值。当然我们也能使用SQLServer储存值,我们这篇文章就专门用于讲解这种方法。 运行InstallSqlState.sql文件 首先需要在WinntMicrosoft.Net中找到InstallSqlState.sql文件,然后在SQLServer中执行它。在我的机器中,它存在于E:WINNTMicrosoft.NETFrameworkv1.0.2914目录中。这个文件是微软自己提供的,里面有很全的SQL语句,大家放心使用。下图就是生成的数据表。 修改你的web.config文件,指定Session的mode为SQLServer 将web.config的sessionState部分改成: 创建Asp.NetWebForms 下面就建立一个测试的ASP.net程序,使用Session程序这里就不用多说了,下面是我的程序的截图。这个程序只是简单的储存一个字符串数据于Session中,然后再显示这个数据在Label控件中。 现在所有的Session变量都储存在数据表中,而不是内存中了。你可打开ASPStateTempSessions表来查看这些Session数据了。 删除这些数据库和表 如果你不喜欢这个数据储存方式,看得实在是不爽,那么你可以把这些表和数据库完全删除掉。这个也不要担心这种删除会影响数据库,因为微软同样也得供给你们一个删除SQL文件,名叫UnintallSQLState.sql。它与IntallSQLState.sql一样放在.Net的Config目录中。

ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题。
采用了如下方法:
1、asp.net Session的实现:
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
ASP.NET中Session的状态保持方式  
ASP.NET提供了Session对象,从而允许程序员识别、存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息。Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件。程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。
   在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。
  ASP.NET中Session的状态保持是由web.config文件中的<system.web>标记下的<sessionstate>标记的mode属性来决定的。该属性有四种可能的值:Off、Inproc、StateServer和SQlServer.
 设为Off会禁用Session.
  Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。
 为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。
  ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,来使用这个Windows服务提供的状态管理方法。
 除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下:
 mode=”StateServer”
 stateConnectionString="tcpip=127.0.0.1:42424"
    使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。
   另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两国文件存放在下面路径中:
  <%SYSTEMDRIVER%>WinntMicrosoft.NETFramework<%version%>
要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe
  osql -s [server name] -u [user] -p [password] <InstallSqlState.sql
例如:
  osql -s (local) -u as -p “”-i  InstallSqlState.sql
做好必要的数据库准备工作后,将web.config文件中的sessionstate元素的mode属性改为”sqlserver”,并指定SQL连接字符串。具体如下:
  mode="SQLServer"
    sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"
使用SQLServer模式处了可以使Session的状态不依赖于IIS服务器之外,还可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大的可靠性。 

1、Session的存储方式。

session是工作在你的应用程序进程中的。asp.net进程、iis往往会在20分钟之后重启相关的应用程序,缓冲池满了(例如100个之 后)也会重启,各种进程保护措施都会随时重新启动,因此InProc方式丢失session是很正常的事。csdn上明确告诉了这种模式只能保存“易失 的、暂时的 ”变量,这是cache没有之前的一种解决方案。而长期保持的数据就要保存在外部数据源中。状态服务器就是一种进程外的数据源。

 
2、丢失原因:
转(1):Asp.net 默认配置下,Session莫名丢失的原因及解决办法 
      正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。
原因和解决办法写出来。
原因:
由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState 
mode='InProc'
stateConnectionString='tcpip=127.0.0.1:42424'
sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes'
cookieless='true'
timeout='60'/>

  session其实分为客户端Session和服务器端Session。

 

我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感)。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
[asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。]

  当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端Session。

StateServer 模式的实质是,把Session 存放在一个单独的进程里,此进程独立于 aspnet_这时我们可以使用url的方式来存储客户端Session,session是工作在你的应用程序进程中的。wp.exe 或 w3wp.exe 。启用此服务后,在“任务管理器”中可以看到一个名为 aspnet_state.exe 的进程,下面开始说明一下设置的具体步骤:

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications
解决办法:
      前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

  其实客户端Session默认是以cookie的形式来存储的,所以当用户禁用了cookie的话,服务器端就得不到SessionID。这时我们可以使用url的方式来存储客户端Session。也就是将SessionID直接写在了url中,当然这种方法不常用。

1、 修改注册表(关键步骤,如下图)

      现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。
      除此之外,我们还可以将Session通过其他电脑的StateService来保存[如使用状态服务器]。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

  我们大多数提到的Session都是指服务器端Session。他有三种存储方式(自定义存储在这里不做讨论):

运行 regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_state Parameters 节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)→ 设置 Port (端口号)

      如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。
      在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
    ......
}
具体的序列化相关的知识请参这里。
至此,问题解决。

  1.1保存在IIS进程中:

注意事项:

参考文章:
ASP.NET Session State FAQ
ASP.NET Session State
[ASP.NET] Session 详解
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
ASP.NET HTTP 运行时
.NET 中的对象序列化  
备注
(1)使用 StateServer 模式
确保运行 ASP.NET 状态服务的服务器是要存储会话状态信息的远程服务器。该服务与 ASP.NET 一起安装,其默认位置为
<驱动器>:systemrootMicrosoft.NETFrameworkversionaspnet_state.exe。 
在应用程序的 Web.config 文件中,
设置 mode=StateServer 并设置 stateConnectionString 属性。
例如,stateConnectionString="tcpip=sarath:42424"。 
(2)使用 SQLServer 模式
在运行 SQL Server 的计算机(它将存储会话状态)上运行 InstallSqlState.sql
(默认的安装位置为 <驱动器>:systemrootMicrosoft.NETFrameworkversion)。
这将创建一个名为 ASPState 的数据库,该数据库具有新的存储过程并且在 TempDB 数据库中具有 ASPStateTempApplications 表和 ASPStateTempSessions 表。
在应用程序的 Web.config 文件中,设置 mode=SQLServer 并设置 sqlConnectionString 属性。例如,sqlConnectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。 
(3)示例 
以下示例指定若干会话状态配置设置。 

  保存在IIS进程中是指把Session数据保存在IIS的运行的进程中,也就是inetinfo.exe这个进程中,这也是默认的Session的存方式,也是最常用的。

a)、若ASP.NET State Service 正在运行,修改注册表内容后,则需要重新启动该服务

<configuration> 
<system.web> 
<sessionState mode="InProc" 
cookieless="true" 
timeout="20"/> 
</sessionState> 
</system.web> 
</configuration> 
要求 
包含于:<system.web> 
Web 平台:IIS 5.0、IIS 5.1、IIS 6.0 
配置文件:Machine.config、Web.config 
配置节处理程序:System.Web.SessionState.SessionStateSectionHandler 
请参见

  这种方式的优点是简单,性能最高。但是当重启IIS服务器时Session丢失。

b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424 是默认的端口

ASP.NET 配置 | ASP.NET 设置架构 | SessionStateModule
[出现原因:]在Windows2003的服务器中的IIS6加入了应用程序池来回收一些无用的进程的功能,当由于网站程序的错误或访问量太多的导致的应用程序池会自动回收该进程,防止网站进入“死机”状态,而这时候的应用程序池的回收就会导致session变量被清除,就出现了session变量不见的现象。
为了解决这种在Windows2003下才出现的问题,我们在服务端起动ASP.NET State Service服务,并且在系统的machine.config做了一些改动。现在默认的情况下会话状态mode是StateServer。如果您的网站根目录下也配有一个web.config配置文件,请把mode="InProc"改成mode="StateServer",如下代码,就可以防止session变量的丢失:
<sessionState 
mode="StateServer" 
stateConnectionString="tcpip=127.0.0.1:42424" 
sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI" 
cookieless="false" 
timeout="30" 
/> 

  1.2.保存在StateServer上

c)、AllowRemoteConnection 的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的ASP.NET State Service,即把 Session 存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString 为“tcpip=localhost: 42424”与“tcpip=127.0.0.1:42424”的情况,方可使用ASP.NET State Service

  • 注:只适用于支持asp.net的用户。 

  这种存储模式是指将Session数据存储在一个称为Asp.Net状态服务进程中,该进程独立于Asp.Net辅助进程或IIS应用程序池的单独进程,使用此模式可以确保在重新启动Web应用程序时保留会话状态,并使会话状态可以用于网络中的多个Web服务器。

2、 开启 ASP.NET State Service

 
转(2):原因及一些解决之道 
将Session保存在State Server里:
1.启动服务“ASP.NET State Service”,
2.然后,修改web.config:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="140000"
/>
注意://mode="StateServer"这种模式下即使修改页面也不会丢失session!
当然:mode="InProc"如果你的模式为这种,修改页面的时候会丢失session!!!!!!

  1.3.保存在SQL Server数据库中

右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 双击“ASP.NET State Service” → 启动(可设为“自动”)

在WebConfig里将Session的Mode设成SQLServer或者StateServer都不会丢Session的,
前者需要写入数据库,后者需要系统开StateServer服务。
  
原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失。[目录的删除操作一定丢失session。asp.net的内部机制对待目录有点像个守财奴,它死守着目录,你创建它不会管(往里加),一但创建他就会监视该目录,若你要删除或重命名它的(动它的目录),它就发生重起了。。]
原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失
原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开
原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失。
[默认时间是20分钟,可以在Web.Config中设置Session的timeOut,如改为60分钟等]
原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失
原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式
解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间。
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多

  可以配置把Session数据存储到SQL Server数据库中,为了进行这样的配置,程序员首先需要准备SQL Server数据服务器,然后在运行.NET自带安装工具安装状态数据库。

说明:只要安装了 .Net Framework ,都拥有此服务。

  1. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
    4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
    5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失。 

  这种方式在服务器挂掉重启后都还在,因为他存储在内存和磁盘中。

3、 更改 Web.config

 
转(3):Session丢失原因与解决方案小结 
可能的原因1:
win2003 server下的IIS6默认设置下对每个运行在默认应用池中的工作者进程都会经过20多个小时后自动回收该进程,造成保存在该进程中的session丢失。

  下面是这三种方式的比较:

打开 Web.config → 找到 <sessionState> 节点内容

因为Session,Application等数据默认保存在运行该Web应用程序的工作者进程中,如果回收工作者进程,则会造成丢失。

InProc

<sessionState

解决办法:
修改配置,设置为不定时自动回收该工作者进程,比如设置为当超出占用现有物理内存60%后自动回收该进程。通过使用默认应用程序池,可以确保多个应用程序间互相隔离,保证由于一个应用程序的崩溃不会影响另外的Web应用程序。还可以使一个独立的应用程序运行在一个指定的用户帐号特权之下。如果使用StateServer方式或者Sql Server数据库方式来保存Session,则不受该设置的影响。

StateServer

mode=”InProc”

可能的原因2:
系统要运行在负载平衡的 Web 场环境中,而系统配置文件web.config中的Session状态却设置为InProc(即在本地存储会话状态),导至在用户访问量大时,Session常经超时的情况。引起这个现象的原因主要是因为用户通过负载平衡IP来访问WEB应用系统,某段时候在某台服务器保存了Session的会话状态,但在其它的WEB前端服务器中却没有保存Session的会话状态,而随着并发量的增大,负载平衡会当作路由随时访问空闲的服务器,结果空闲的服务器并没有之前保存的Session会话状态。

SQLServer

stateConnectionString=”tcpip=127.0.0.1:42424″

解决办法: 
1.当您在负载平衡的 Web 场环境中运行 ASP.NET Web 应用程序时,一定要使用 SqlServer 或 StateServer 会话状态模式,在项目中我们基于性能考虑并没有选择SqlServer模式来存储Session状态,而是选择一台SessionStateServer 服务器来用户的Session会话状态。我们要在系统配置文件web.config中设置如下: 
<sessionState 
mode="StateServer" cookieless="false" timeout="240" 
stateConnectionString="tcpip=192.168.0.1:42424" stateNetworkTimeout="14400" /> 
还要添加一项 
<machineKey 
validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/>  

存储物理位置

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

  1. 我们同时还要在SessionStateServer 服务器中启动ASP.NET State Service服务,具体设置:控制面板>>管理工具>>服务>>ASP.NET State Service,把它设为自动启动即可。 

  2. 每台前端WEB服务的Microsoft“Internet 信息服务”(IIS)设置 
                 要在 Web 场中的不同 Web 服务器间维护会话状态,Microsoft“Internet 信息服务”(IIS) 配置数据库中 Web 站点的应用程序路径(例如,LMW3SVC2)与 Web 场中所有 Web 服务器必须相同。大小写也必须相同,因为应用程序路径是区分大小写的。在一台 Web 服务器上,承载 ASP.NET 应用程序的 Web 站点的实例 ID 可能是 2(其中应用程序路径是 LMW3SVC2)。在另一台 Web 服务器上,Web 站点的实例 ID 可能是 3(其中应用程序路径是 LMW3SVC3)。因此,Web 场中的 Web 服务器之间的应用程序路径是不同的。我们必须使Web 场Web 站点的实例 ID 相同即可。你可以在IIS中把某一个WEB配置信息保存为一个文件,其他Web 服务器的IIS配置可以来自这一个文件。您如果想知道具体的设置请访问Microsoft Support网站: 

IIS进程(内存)

cookieless=”false”

 
转(4):丢失问题集锦 
SessionState 的Timeout),其主要原因有三种。
一:有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。
二:程序内部里有让Session掉失的代码,及服务器内存不足产生的。
三:程序有框架页面和跨域情况。
第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时自己也不要去编辑它)
第二种是检查代码有无Session.Abandon()之类的。
第三种是在Window服务中将ASP.NET State Service 启动。

还有可能就是你在测试期间改动了,网站的文件。

Windows服务进程(内存)

 

下面是帮助中的内容:
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一个简单、易于使用的会话状态模型,您可以使用该模型跨多个 Web 请求存储任意数据和对象。
它使用基于字典的、内存中的对象引用(这些对象引用存在于 IIS 进程中)缓存来完成该操作。
使用进程内会话状态模式时请考虑下面的限制:
使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。这些重新启动通常会在下面的情况中发生:
(1)在应用程序的 Web.config 文件的 <processModel> 元素中,设置一个导致新进程在条件被满足时启动的属性,例如 memoryLimit。
(2)修改 Global.asax 或 Web.config 文件。
(3)更改到 Web 应用程序的 Bin 目录。
(4)用杀毒软件扫描并修改 Global.asax 文件、Web.config 文件或 Web 应用程序的 Bin 目录下的文件。
(5)如果在应用程序的 Web.config 文件的 <processModel> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。
澳门新濠3559, 
我也碰到过。本机器上的Session或者Cookie丢失。
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="40"
/>
mode=""的三个属性。本地/其他机器/sqlserver。
很多网络架构,各个服务器之间都是通过一台专门保存状态的服务器(专门的状态服务器)来保存比如说session,cookie..
 
我以前遇到这种问题,我用了以下几个方法来解决。现在也没有这种情况发生了。
1、release,不要debug发布。
2、<sessionState cookieless="true" 把cookieless设为true。因为客户端禁用cookie时,session也无效。
3、在IIS中把Session过期时间延长。
4、让杀毒软件不扫描bin文件夹下的文件和Web.Config文件。
以上我是不明不白的做的。不过Session正常使用了!呵呵~~我幸运!
 
没啥好讲的,不要用Session好了,直接用Forms认证把,
我前两天的系统就是用这个搞定的,觉得挺好的。
刚碰到一个类似的问题:在使用frameset的时候,session变量丢失。
在微软的网站上找到了解决的方法

不知道是否有用?

SQLServer数据库(磁盘)

ASP.NET Session丢失解决办法:

IIS--->>应用程序连接池--->>属性---->>[回收][性能][运行状况]里的各项参数尽量都往大的改^_^),我不知道改拉那个才对的,反正我改完后所有的session都好拉.客户的网站和动网论坛的后台也跟着好拉。 

存储类型限制

 sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

 
转(5): 模态窗口中打开新窗口的session丢失 
         一直被这个问题郁闷。在窗口A中使用showModalDialog()打开了一个新的模态窗口B。然后在B窗口中进行一些业务操作,最后还需要根据业务操作打印一些表单,结果此时在B中调用open()方法就会出现session丢失的现象,提示用户重新登陆。
         两天来一直没头苍蝇一样不停的试验各种方法。如果在这个窗口中采用打开非模态对话框的打开方法showModelessDialog()就没有任何问题,但是直接使用open()方法就是不能达到想要的效果。在网上不停的google,到各大bbs寻找解答,提供的都是最简单的应用。好不容易找到一篇文章,其中提到session对象的有效范围,却也没有具体提到我遇到的问题:
IE中:
有效的窗品包括
         1.Session对象只在建立Session对象的窗口中有效。 
         2.在建立Session对象的窗口中新开链接的窗口无效的窗口包括
         1.直接启动IE浏览器的窗口
         2.不是在建立Session对象的窗口中新开链接的窗口。(即作者在建立Session对象的A窗口弹出的B窗口上调用了open()方法。)
考虑只在建立session对象的窗口中有效,于是就在子窗口中重新使用session.setAttribute()方法,以为如此就可以成功,结果还是不行,郁闷。
         早上起来突然来了灵感,既然子窗口中造成了session丢失,在父窗口中是无论如何还存在着session的变量的,我可以不必在子窗口中重新设置session变量,而可以直接调用父窗口的javascript函数open()方法可能会到目的吧。不管如何先试试,结果果然如此。   很多时候问题就是这样的,想要偷懒,于是不自己钻研,到处寻求解答,最后还是得靠自己来搞定。 

无限制

1) StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。这样,我们就能利用本机的StateService服务来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

转载:

可以序列化的类型

除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。在 sessionState标签中,有stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地 址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的 Asp.net程序互通Session了。

可以序列化的类型

    将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端口(默认端口)运行。要在服务器上改变端口,可编辑HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters注册表项中的Port值。
      显然,使用状态服务的优点在于进程隔离,并可在Web farm(网站群)中共享。使用这种模式,会话状态的存储将不依赖于iis进程的失败或者重启,然而,一旦状态服务中止,所有会话数据都会丢失。换言之,状态服务不像SQL Server那样能持久存储数据;它只是将数据存储在内存中。

存储大小限制

2) 如果你有更高的要求,需要在其他服务重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。 

无限制

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。

使用范围

如:

当前请求上下文,对于每个用户独立

[Serializable]

生命周期

public class MyClass

第一次访问网站的时候创建Session超时后销毁

{

优点

......

性能比较高

}

Session不依赖Web服务器,不容易丢失

 ASP.NET还允许将会话数据存储到一个 数据库服务器中,方法是将mode属性变成SqlServer。 在这种情况下,ASP.NET尝试将会话数据存储到由sqlConnectionString属性(其中包含数据源以及登录服务器所需的安全凭证)指定的 SQL Server中。
    为了用恰当的数据库对象来配置SQL erver,管理员还需要创建ASPState数据库,
方法是运行WinDirMicrosoft.NetFrameworkVersion(如:v3.0)文件夹中的 InstallSqlState.sql脚本(WinDir是服务器的Windows文件夹,而Version是你使用的.NET框架版本的安装文件 夹)。要配置SQL服务器,可以在命令行中运行SQL Server 提供的命令行工具osql.exe

缺点

osql -S [ server name] -U [user] -P [password] -i 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连接字符串。具体如下:

序列化与反序列化消耗CPU资源

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

序列化与反序列化消耗CPU资源,从磁盘读取Session比较慢

配置好SQL Server后,应用程序代码运行时就和InProc模式没有什么区别。但要注意的是,由于数据不存储在本地内存,所以存储会话状态的对象需要进行序列化和反序列化,以便通过网络传给数据库服务器,以及从数据库服务器传回。这当然会影响性能。通过在数据库中存储会话状态,可分别针对扩展性及可靠性来有效地平衡性能。另外,可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大限度的可靠性。

使用原则

 

不要存放大量数据

ASP.NET Session丢失问题解决经验:

2、在web.config中配置Session   Web.config文件中的Session配置信息:

1) 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间.

复制代码 代码如下:

2) 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多.

<sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sql connection string"
stateNetworkTimeout="number of seconds"
/>

3) 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失.

mode 设置将Session信息存储到哪里:
    — Off 设置为不使用Session功能;
    — InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值;
    — StateServer 设置为将Session存储在独立的状态服务中;
    — SQLServer 设置将Session存储在SQL Server中。
  
  cookieless 设置客户端的Session信息存储到哪里:
    — ture 使用Cookieless模式;这时客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。比如网址为
    — false 使用Cookie模式,这是默认值。

4) 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。

  timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟。

 

  stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。(42424是默认端口)。

 

  sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。

 

  stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

 

  **下面来说下用StateServer和SqlServer来存储Session的方法

 

**  2.1 StateServer
  第1步是打开状态服务。依次打开“控制面板”→“管理工具”→“服务”命令,找到ASP.NET状态服务一项,右键单击服务选择启动。
  如果你正式决定使用状态服务存储Session前,别忘记修改服务为自启动(在操作系统重启后服务能自己启动)以免忘记启动服务而造成网站Session不能使用
  第2步,在system.web节点中加入:stateNetworkTimeout="20"> stateConnectionString表示状态服务器的通信地址(IP:服务端口号)。由于我们现在在本机进行测试,这里设置成本机地址127.0.0.1。状态服务默认的监听端口为42422。当然,您也可以通过修改注册表来修改状态服务的端口号。
  (修改注册表来修改状态服务的端口号的方法:在运行中输入regedit启动注册表编辑器—依次打开HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters节点,双击Port选项—选择基数为十进制,然后输入一个端口号即可。)

<sessionState> 元素设置:

  2.2 SqlServer
  在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:
[system drive]winntMicrosoft.NETFramework[version]
然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。
  修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:sqlConnectionString="data source=localhost; Integrated Security=SSPI;"(这种是通过windows集成身份验证)

<system.web>

  3、Session的生命周期
  Session的生命周期其实在第一节已经讲过了,和不同的存储过程有关。

    <sessionState   mode="Off|InProc|StateServer|SQLServer"

  4、遍历以及销毁Session
  4.1遍历:

    cookieless="true|false"

复制代码 代码如下:

    timeout="number of minutes"

System.Collections.IEnumerator SessionEnum = Session.Keys.GetEnumerator();
while (SessionEnum.MoveNext())
{
Response.Write(Session[SessionEnum.Current.ToString()].ToString() + " ");
}

    stateConnectionString="tcpip=server:port"

4.2 销毁:Session.Abandon()。

    sqlConnectionString="sql connection string"

您可能感兴趣的文章:

  • 关于PHP session 存储方式的详细介绍

stateNetworkTimeout="number of seconds"/>

</system.web>

mode

描述

Off

指示会话状态没有启用。

InProc

默认情况下是InProc,保存20分钟。也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

StateServer

指示在本地或远程服务器上存储会话状态。 ASP.NET 状态服务。默认情况是不启动的。当我们设定mode为StateServer之后,手工将该服务启动。这样,我们就能利用StateServer来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)

SQLServer

指示在  SQL Server? 上存储会话状态

 

 

属性

描述

cookieless

默认不用Cookie来传递会话ID 【<sessionStatemode="InProc"cookieless="false" /> cookieless="false" :表示Session不需要Cookie传递;如果修改为cookieless="true":表示Session的ID在Cookie中传递,这样访问时地址栏中会出现多余的文字如:http://localhost:11209/Web/(S(lsua21yjunmcf245wnkogy55))/Index.aspx 】。采取这种方式,不管Cookie还是隐藏表单字段都用不着了。所以,即使网页中没有使用表单,也能加入会话。但是这种方法,应用程序的状态将依赖于 ASP.NET进程,当IIS进程崩溃或者正常重启时,保存在进程中的状态将丢失。

stateConnectionString

指定远程存储会话状态的服务器名称或地址以及端口。端口值默认为 42424。当 mode 为 StateServer 值时,该属性是必需的。确保运行 ASP.NET 状态服务的服务器是存储会话状态信息的远程服务器。该服务随 ASP.NET 一起安装,默认情况下为 %SystemRoot%Microsoft.NETFrameworkVersionNumberaspnet_state.exe。

< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />注意

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

默认值为 "tcpip=127.0.0.1:42424"。

 

 

sqlConnectionString

 

 

 

为运行 SQL Server 的计算机指定连接字符串。该属性在 mode 属性设置为 SQLServer 值时是必需的

注意

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

默认值为 "data source=127.0.0.1;Integrated Security=SSPI"。

allowCustomSqlDatabase

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

 

timeout

 

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

会话 timeout 配置设置仅适用于 ASP.NET 页。更改会话 timeout 值不会影响 ASP 页的会话超时时间。同样,更改 ASP 页的会话超时时间不会影响 ASP.NET 页的会话超时时间。默认值为 20 分钟。

stateNetworkTimeout

当使用 StateServer 模式存储会话状态时,指定在会话被放弃前 Web 服务器和状态服务器之间的 TCP/IP 网络连接处于空闲状态的秒数。默认值是 10。

cookieName

指定存储会话标识符的 Cookie 的名称。此属性是 .NET Framework 2.0 版中的新属性。默认值为 "ASP.NET_SessionId"。

regenerateExpiredSessionId

指定当客户端指定了过期的会话 ID 时是否重新发出会话 ID。默认情况下,当启用了 regenerateExpiredSessionId 时,仅为 cookieless 模式重新发出会话 ID。  

此属性是 .NET Framework 2.0 版中的新属性。默认值为 true。

 

使用 StateServer 模式:

       确保在存储会话状态信息的远程服务器上正在运行 ASP.NET 状态服务。此服务随 ASP.NET 一起安装,并且默认位于 <Drive>:systemrootMicrosoft.NETFrameworkversionaspnet_state.exe。

使用 SQLServer 模式:

       在运行 SQL Server 的计算机(将存储会话状态)上运行 InstallSqlState.sql(默认安装在 <Drive>:systemrootMicrosoft.NETFrameworkversion 中)。它将使用新的存储过程和 TempDB 数据库中的 ASPStateTempApplications 和 ASPStateTempSessions 表创建一个称为 ASPState 的数据库。

 

不常用属性:

customProvider

可选的 String 属性。

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

此属性是 .NET Framework 2.0 版中的新属性。

默认值为空字符串 ("")。

partitionResolverType

可选的 String 属性。

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

此属性是 .NET Framework 2.0 版中的新属性。

默认值为空字符串。

sqlCommandTimeout

可选的 TimeSpan 属性。

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

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 0:00:30(30 秒)。

useHostingIdentity

可选的 Boolean 属性。

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

如果为 true,ASP.NET 将使用下列进程凭据之一来连接会话状态存储区:

宿主进程;对于 Microsoft Internet 信息服务 [IIS] 5 和 5.1 版为 ASPNET,对于 Microsoft Windows Server 2003 则为 NETWORK SERVICE。

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

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

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

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 true。

注意

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

 

timeout=”20″ />

→ 将其改为以下内容

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

注意事项:
1、timeout=”20″为Session 20分钟超时

2、IP 地址(可以是远程计算机 IP、计算机名称、域名)与端口号,端口号需与ASP.NET State Service 的服

编辑:数据库 本文来源:这时我们可以使用url的方式来存储客户端Session,

关键词: