请问如何解决程序发布到互联网后session一分钟就丢失了。???(急急急) 请问大虾们。。 怎么解决用.net中程序发布到互联网后session几乎不到一分钟就过期了。!??在开发环境中怎么都没出现这个问题。。 已发布就这样。 程序根本没法用。! 并且在web.config中设置session模式为StateServer就报500错误“返回的状态码为500代码为0”先谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看一看是不是杀毒软件或者什么一直在更改bin目录下面的文件,导致了IIS进程自动重启 如LS所说如果你的Session正确设置了时间,就应该好好检查一下 把session存数据库就不丢了,具体:1.用InstallSqlState.sql(本机的vs系统目录下面)在服务器上生成个存session的数据库;2.web.config中的sessionState设成SQLServer<sessionState mode="SQLServer" InstallSqlState.sql一般保有存在:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322(根据vs版本有所不同)\下面 http://hi.baidu.com/flashdata/blog/item/9bc4841070211d06213f2e89.html mode="InProc" == 默认的配置方式很容易丢失Session 请参考 asp中Session的工作原理: asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。 原因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的方式 解决丢失的经验 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丢失 问:为什么Session在有些机器上偶尔会丢失? 答:可能和机器的环境有关系,比如:防火墙或者杀毒软件等,尝试关闭防火墙。 问:为什么当调用Session.Abandon时并没有激发Session_End方法? 答:首先Session_End方法只支持InProc(进程内的)类型的Session。其次要激发Session_End方法,必须存在Session(即系统中已经使用Session了),并且至少要完成一次请求(在这次请求中会调用该方法)。 问:为什么当我在InProc模式下使用Session会经常丢失? 答:该问题通常是由于应用程序被回收导致的,因为当使用进程内Session时,Session是保存在aspnet_wp进程中,当该进程被回收Session自然也就没有了,确定该进程是否被回收可以通过查看系统的事件查看器获得信息。 具体信息请参考: Session variables are lost intermittently in ASP.NET applications http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148 在1.0的时候也有一个bug会导致工作进程被回收并重启,该bug已经在1.1和sp2中修复。 关于该bug的详细信息请参考: ASP.NET Worker Process (Aspnet_wp.exe) Is Recycled Unexpectedly. http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792 问:什么类型的对象可以保存在Session里? 答:这依赖使用的Session的模式,当使用的是进程内(InProc)的Session那么可以轻松的保存任何对象。如果你使用了非InProc的模式,则只能保存可以序列化和反序列化的对象,如果此时保存的对象不支持序列化,则不能保存到这种模式(非InProc)的Session里。 问:为什么在Session_End中不能使用Response.Redirect和Server.Transfer方法跳转页面? 答:Session_End是一个在服务器内部激发的事件处理函数。它是基于一个服务器内部的计时器的,在激发该事件时服务器上并没有相关的HttpRequest对象,因此此时并不能使用Response.Redirect和Server.Transfer方法。 问:在Session_End中是否可以获得HttpContext对象? 答:不行,因为这个事件并没有和任何的请求(Request)相关联,没有基于请求的上下文。 问:在Web Service中该如何使用Session? 答:为了在Web Service中使用Session,需要在Web Service的调用方做一些额外的工作,必须保存和存储调用Web Service时使用的Cookie。详细信息请参考MSDN文档的HttpWebClientProtocol.CookieContainer属性。然而,如果你使用代理服务器访问Web Service由于框架的限制,两者不能共享Session。 问:当我使用webfarm时,当我重定向到其他的Web服务器时Session为什么会丢失? 答:详细信息请参考: PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode http://support.microsoft.com/default.aspx?scid=kb;en-us;325056 问:Session在global.asax中的那些事件中有效? 答:Session只有在AcquireRequestState事件之后有效,该事件之后的事件都可以使用Session。 问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制? 答:Session实现了Reader/Writer的锁机制: 当页面对Session具有可写功能(即页面有 <%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。 当页面对Session具有只读功能(即页面有 <%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。 读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。 问:Session平滑超时意味着什么? 答:Session平滑超时意味着只要你的页面访问(使用)了Session,超时时间将被刷新(可以理解为重新计时),即从该页面请求开始,将重新计算超时时间。但是,该页面不能禁用Session。它会自动的访问当前页面的Session,刷新超时时间。 问:在global.asax中的事件处理函数中Session为什么无效? 答:依赖于在哪个事件处理函数中使用Session,Session在AcquireRequestState事件之后才有效,该事件之后的所有事件处理函数都可以使用Session,之前的则不能。 问:当我使用InProc模式保存Session时,此时的Session是保存在哪里? 答:不同的IIS的处理方式不同, 当使用的是IIS5的时候Session是保存在aspnet_wp.exe的进程空间里的。 当使用的是IIS6时,默认情况下所有的应用程序共享应用程序池,Session保存在w3wp.exe的进程空间中。 问:当页面出现错误后我的Session是否将被保存?我需要在Session_End中处理一些清理工作,但是失败了,为什么? 答:Session_End只有在Session运行在InProc模式下才会被执行。Session_End使用的帐号是运行aspnet_wp工作进程的帐号(这个可以在machine.config中设置)。因此,如果在Session_End方法里,使用集成安全性链接到SQL,它将使用aspnet_wp进程的帐号打开链接,此时成功与否则依赖于你的SQL的安全性设置。 问:在Session_End是我是否可以获得有效的HttpSessionState和HttpContext对象? 答:你可以在这个方法中获得HttpSessionState对象,可以直接使用Session来访问即可。但是不能获得HttpContext对象,因为该事件并没有和任何请求相关联,因此不存在上下文对象。 问:在SQLServer模式下使用Session,为什么我的Session不过期? 答:在SqlServer模式下,Session的过期是通过SQL Agent的注册工作完成的,请检查你的SQL Agent是否运行? 问:当我设置EnableSessionState为“ReadOnly”后,但是我在InProc模式下依然可以修改Session的值,这是为什么? 答:即使EnableSessionState标示为ReadOnly,但是在InProc模式下用户依然可以编辑Session。唯一不同的是,在请求过程中Session将不会被锁住。 问:为什么在切换成SQLServer模式后我的请求被挂起了? 答:检查在Session里面是否都保存的是可以保存在SQLServer模式下的对象,即这些对象必须支持序列化。 问:当Session设置成cookieless后会有什么影响? 答:当把cookieless设置成true时,主要会有下面的约束: 1、在页面中不能使用绝对链接 2、在应用程序中在除了Http和Https之间的切换时需要完成一些其他的步骤。 如果发送一个链接给其他人,此时的URL里面将包含Session ID的信息,所以两个人将公用一个Session。 -------------在论坛里摘的 绑定数据问题 Extaspnet如何通过前台js获得grid选中某行某列的值(不用后台操作) 急求js实现可以上下分页的日历。 重新开贴!CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables[0])问题!!! 怎么解除危险警告 在.net里面怎么使用empty?求救 关于Server.UrlEncode的问题、 真是不知道那有错误 关于同一个服务器的两个虚拟站点之间传递参数 !!!这个问题你碰到没 !!! 创建非聚合索引语句?? 高分:IE6下分页不成功,但IE7可以
1.用InstallSqlState.sql(本机的vs系统目录下面)在服务器上生成个存session的数据库;2.web.config中的sessionState设成SQLServer<sessionState mode="SQLServer"
==
默认的配置方式很容易丢失Session 请参考 asp中Session的工作原理:
asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。 原因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的方式 解决丢失的经验
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丢失 问:为什么Session在有些机器上偶尔会丢失?
答:可能和机器的环境有关系,比如:防火墙或者杀毒软件等,尝试关闭防火墙。 问:为什么当调用Session.Abandon时并没有激发Session_End方法?
答:首先Session_End方法只支持InProc(进程内的)类型的Session。其次要激发Session_End方法,必须存在Session(即系统中已经使用Session了),并且至少要完成一次请求(在这次请求中会调用该方法)。 问:为什么当我在InProc模式下使用Session会经常丢失?
答:该问题通常是由于应用程序被回收导致的,因为当使用进程内Session时,Session是保存在aspnet_wp进程中,当该进程被回收Session自然也就没有了,确定该进程是否被回收可以通过查看系统的事件查看器获得信息。
具体信息请参考:
Session variables are lost intermittently in ASP.NET applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
在1.0的时候也有一个bug会导致工作进程被回收并重启,该bug已经在1.1和sp2中修复。
关于该bug的详细信息请参考:
ASP.NET Worker Process (Aspnet_wp.exe) Is Recycled Unexpectedly.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
问:什么类型的对象可以保存在Session里?
答:这依赖使用的Session的模式,当使用的是进程内(InProc)的Session那么可以轻松的保存任何对象。如果你使用了非InProc的模式,则只能保存可以序列化和反序列化的对象,如果此时保存的对象不支持序列化,则不能保存到这种模式(非InProc)的Session里。 问:为什么在Session_End中不能使用Response.Redirect和Server.Transfer方法跳转页面?
答:Session_End是一个在服务器内部激发的事件处理函数。它是基于一个服务器内部的计时器的,在激发该事件时服务器上并没有相关的HttpRequest对象,因此此时并不能使用Response.Redirect和Server.Transfer方法。 问:在Session_End中是否可以获得HttpContext对象?
答:不行,因为这个事件并没有和任何的请求(Request)相关联,没有基于请求的上下文。 问:在Web Service中该如何使用Session?
答:为了在Web Service中使用Session,需要在Web Service的调用方做一些额外的工作,必须保存和存储调用Web Service时使用的Cookie。详细信息请参考MSDN文档的HttpWebClientProtocol.CookieContainer属性。然而,如果你使用代理服务器访问Web Service由于框架的限制,两者不能共享Session。
问:当我使用webfarm时,当我重定向到其他的Web服务器时Session为什么会丢失?
答:详细信息请参考:
PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056 问:Session在global.asax中的那些事件中有效?
答:Session只有在AcquireRequestState事件之后有效,该事件之后的事件都可以使用Session。
问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制?
答:Session实现了Reader/Writer的锁机制:
当页面对Session具有可写功能(即页面有 <%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。
当页面对Session具有只读功能(即页面有 <%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。 问:Session平滑超时意味着什么?
答:Session平滑超时意味着只要你的页面访问(使用)了Session,超时时间将被刷新(可以理解为重新计时),即从该页面请求开始,将重新计算超时时间。但是,该页面不能禁用Session。它会自动的访问当前页面的Session,刷新超时时间。 问:在global.asax中的事件处理函数中Session为什么无效?
答:依赖于在哪个事件处理函数中使用Session,Session在AcquireRequestState事件之后才有效,该事件之后的所有事件处理函数都可以使用Session,之前的则不能。
问:当我使用InProc模式保存Session时,此时的Session是保存在哪里?
答:不同的IIS的处理方式不同,
当使用的是IIS5的时候Session是保存在aspnet_wp.exe的进程空间里的。
当使用的是IIS6时,默认情况下所有的应用程序共享应用程序池,Session保存在w3wp.exe的进程空间中。 问:当页面出现错误后我的Session是否将被保存?我需要在Session_End中处理一些清理工作,但是失败了,为什么?
答:Session_End只有在Session运行在InProc模式下才会被执行。Session_End使用的帐号是运行aspnet_wp工作进程的帐号(这个可以在machine.config中设置)。因此,如果在Session_End方法里,使用集成安全性链接到SQL,它将使用aspnet_wp进程的帐号打开链接,此时成功与否则依赖于你的SQL的安全性设置。 问:在Session_End是我是否可以获得有效的HttpSessionState和HttpContext对象?
答:你可以在这个方法中获得HttpSessionState对象,可以直接使用Session来访问即可。但是不能获得HttpContext对象,因为该事件并没有和任何请求相关联,因此不存在上下文对象。 问:在SQLServer模式下使用Session,为什么我的Session不过期?
答:在SqlServer模式下,Session的过期是通过SQL Agent的注册工作完成的,请检查你的SQL Agent是否运行? 问:当我设置EnableSessionState为“ReadOnly”后,但是我在InProc模式下依然可以修改Session的值,这是为什么?
答:即使EnableSessionState标示为ReadOnly,但是在InProc模式下用户依然可以编辑Session。唯一不同的是,在请求过程中Session将不会被锁住。 问:为什么在切换成SQLServer模式后我的请求被挂起了?
答:检查在Session里面是否都保存的是可以保存在SQLServer模式下的对象,即这些对象必须支持序列化。
问:当Session设置成cookieless后会有什么影响?
答:当把cookieless设置成true时,主要会有下面的约束:
1、在页面中不能使用绝对链接
2、在应用程序中在除了Http和Https之间的切换时需要完成一些其他的步骤。
如果发送一个链接给其他人,此时的URL里面将包含Session ID的信息,所以两个人将公用一个Session。
-------------
在论坛里摘的