asp.net IIS session丢失 session Key丢失

http://www.yesky.com/imagesnew/software/asp/innerobject/session/intr12d0.htm

http://hi.baidu.com/djiz/blog/item/addcd61be69806f2af5133ae.html

http://bbs.dg.gd.cn/bview.asp?BAID=1321A3A50502E4WU2BA30SCT

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

http://community.csdn.net/Expert/topic/3100/3100218.xml?temp=.4426386
还有可能就是你在测试期间改动了,网站的文件。


下面是帮助中的内容:
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一个简单、易于使用的会话状态模型,您可以使用该模型跨多个 Web 请求存储任意数据和对象。它使用基于字典的、内存中的对象引用(这些对象引用存在于 IIS 进程中)缓存来完成该操作。使用进程内会话状态模式时请考虑下面的限制:

使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。这些重新启动通常会在下面的情况中发生:
在应用程序的 Web.config 文件的 <processModel> 元素中,设置一个导致新进程在条件被满足时启动的属性,例如 memoryLimit。
修改 Global.asax 或 Web.config 文件。
更改到 Web 应用程序的 \Bin 目录。
用杀毒软件扫描并修改 Global.asax 文件、Web.config 文件或 Web 应用程序的 \Bin 目录下的文件。
如果在应用程序的 Web.config 文件的 <processModel> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。


我也碰到过。本机器上的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..


我遇到的也是在框架(frame)内登陆有时session会丢失,无奈只好放弃框架

启动ASP.NET State Service服务

然后设置Webconfig文件。

<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:999999"(自定义)
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"(自定义)
cookieless="false"
timeout="20"
/>


我以前遇到这种问题,我用了以下几个方法来解决。现在也没有这种情况发生了。
1、release,不要debug发布。
2、<sessionState cookieless="true" 把cookieless设为true。因为客户端禁用cookie时,session也无效。
3、在IIS中把Session过期时间延长。
4、让杀毒软件不扫描bin文件夹下的文件和Web.Config文件 。
以上我是不明不白的做的。不过Session正常使用了!呵呵~~我幸运!

没啥好讲的,不要用Session好了,直接用Forms认证把,
我前两天的系统就是用这个搞定的,觉得挺好的。


刚碰到一个类似的问题:在使用frameset的时候,session变量丢失。
在微软的网站上找到了解决的方法
http://support.microsoft.com/kb/323752/EN-US/
不知道是否有用?


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


将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!!!!!!


在WebConfig里将Session的Mode设成SQLServer或者StateServer都不会丢Session的,前者需要写入数据库,后者需要系统开StateServer服务。

iis6 + win2003server session 丢失 改变 iframe不能获得
2009年06月11日 星期四 10:44

单个程序池启动的进程大于一个就不能保持会话,用一个可以

打开应用程序池设置:
在回收栏的 “回收工作进程” 和 性能栏的 “在空闲此段时间后关闭工作进程” 取消
添加回收栏“在下列时间回收” 然后添加上时间 根据你站访问量设置。访问量不大,可以设置晚上回收一次。

参考文章二:

如何检查ASP.NET中的session lost
1, 最简单的情况就是所有用户的所有session都丢了。这种情况一般发生在In-Proc的session mode上。原因就是appdomain挂了。看appdomain有没有recycle, 跟或asp.net process有没有crash. 直接看perfmon就可以了
2, 稍微麻烦一点的就是一个用户的session丢了,不是所有用户的session丢。首先是要在session start里面做log. 把每一个session id的创建时间都记录到log里面。这样问题发生的时候session丢了session id总还在吧,比较log看看这个session 是不是刚刚建立的。如果是,很有可能是客户端的原因导致session id丢了,其实就是cookie丢了。如果不是,那我们继续在session start里面记录一个我们自定义session value, 看看这个测试用的session value是不是丢。如果这个也丢,9成是用户调了Session.Clear.
3. 如果我们这个session value没有丢,情况就变成一个用户的session里面的一部分value丢了。这9成还是由于用户的代码导致的。唯一的解决的方法+最有效的方法只有加log. 加log的技巧是:
1) 在session start里面把这个session创建时间记录到session里面
2) 在代码中对session操作的地方,写log到以sessionid为文件名的文件里面去
3) log记录对什么session做操作,当前是什么页面什么函数,存在的session是些什么东西,操作的时间
4) 当检查到session丢失的时候,在event log中记录下session id和丢失的key
这样,问题发生的时候,根据event log里面的session id找到log文件,一下子就可以看出来了。
最后,根据解决过的各种奇怪session 丢失的经验,所有的session丢失奇怪问题都是客户端导致的。所以特别检查:
1. 如果用户开两个ie访问一个url, 其实是两个session的。也就说,session的maintain是依靠session id cookie,而这个cookie完全是由client控制的。开发人员设计的时候根本没有考虑到开两个ie访问的情况,用户在一个ie里面去写session, 在另外一个ie里面去读,当然不成功
2. 用户依靠client script来维护web page的执行持续。client script是不可靠的,所以...
3. 最容易忽视的情况就是这个session其实timeout掉了。可以在session end里面加log看到
最后,思路就是:
1. 看sessionid是否变化。变了,就是客户端或者防火墙问题,只跟设定有关系,跟代码没关系
2. 没变,就是代码问题,注意看是不小心清掉了呢,还是开发人员根本没有考虑有客户端的各种行为

参考文章三:

昨天把服务器有win2000换成了win2003,IIS自然也升级到了6.程序中不少地方运用了iframe,相应的问题也出现了。iframe中的文件得不到父页面的session,application也得不到;但是如果一个独立的页面是可以获得到session以及application的(注:这也不是绝对的,有的时候也会丢失),于是就在浩瀚的WWW世界狂google啊,结果令人大失所望……

是不是IIS6的问题呢,因为在IIS5中,这个问题是不存在的,再加上偶刚接触IIS6,相对于IIS5在工作原理上还是有很大差别的。打开IIS管理器,仔细看了看,原来有一个应用程序池……果然问题就出现在了这里,下面向大家详细介绍如何解决在windows2003、IIS6中,asp或者asp.net程序session、application丢失的问题。

1 运行环境:windows2003 + IIS6 + ASP(ASP.NET)

2 问题症状:页面的sessionid会改变,刷新一次改变一次;不能从父页面获得正确的session;iframe中得不到application。

3 解决办法:
a IIS6中相比IIS5增加了一个应用程序池,默认是使用DefaultAppPool,如图一所示。
asp.net IIS session丢失 session Key丢失
图一
b 先为站点建立一个应用程序池,打开IIS管理器,右键点击应用程序池-新建-应用程序池,如图二。
asp.net IIS session丢失 session Key丢失
图二
c 输入你的应用程序池的ID,这里我输入的是localhost,应用程序设置选择第一项,点击确定,可以在应用程序池下看到新建的应用程序池。如图三、图四所示。
asp.net IIS session丢失 session Key丢失
图三

asp.net IIS session丢失 session Key丢失
图四
d 对你的每个站点进行设置,进入站点的属性对话框,点击主目录选项卡,将应用程序池选择为刚才新建的,确定,如图五。其他站点操作类似。
asp.net IIS session丢失 session Key丢失
图五

现在再看看你的asp或者asp.net的相关程序,是不是关于session以及application的问题已经解决了?

Session 对象

可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。

注意 会话状态仅在支持 cookie 的浏览器中保留。

语法

Session.collection|property|method
 

集合

Contents 包含已用脚本命令添加到会话中的项目。
StaticObjects 包含通过 <OBJECT> 标记创建的并给定了会话作用域的对象。

属性

CodePage 将用于符号映射的代码页。
LCID 现场标识。
SessionID 返回用户的会话验证。
Timeout 应用程序会话状态的超时时限,以分钟为单位。

方法

Abandon 该方法破坏 Session 对象并释放其资源。

事件

global.asa 文件中声明下列事件的脚本。

Session_OnEnd
Session_OnStart

有关以上事件及 global.asa 文件的详细信息, 请参阅 Global.asa 参考.

注释

您可以在 Session 对象中存储值。存储在 Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。

<% 
Session("username") = "Janine"
Session("age") = 24
%>
 

但是,如果您将对象存储在 Session对象中,而且您使用 VBScript 作为主脚本语言。则必须使用关键字 Set。如下列脚本所示。

<% Set Session("Obj1") = Server.CreateObject("MyComponent.class1") %>
 

然后,您就可以在后面的 Web 页上调用 MyComponent.class1 揭示的方法和属性,其调用方法如下:

<% Session("Obj1").MyMethod %>
 

也可以通过展开该对象的本地副本并使用下列脚本来调用:

<% 
Set MyLocalObj1 = Session("Obj1") 
MyLocalObj1.MyObjMethod
%>

创建有会话作用域的对象的另一种方法是在 global.asa 文件中使用 <OBJECT> 标记。

但是不能在 Session 对象中存储内建对象。例如,下面每一行都将返回错误。

<%
Set Session("var1") = Session
Set Session("var2") = Request
Set Session("var3") = Response
Set Session("var4") = Server
Set Session("var5") = Application
%>
 

在将对象存储到 Session 对象之前,必须了解它使用的是哪一种线程模型。只有那些标记为“Both”的对象才能存储在没有锁定单线程会话的 Session 对象中。详细信息, 请参阅“创建 ASP 组件”中的“选择线程模型”。

若您将一个数组存储在 Session对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。

<% Session("StoredArray")(3) = "new value" %>
 

这是因为 Session对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。

我们极力建议您在将数组存储在 Session对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Session 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。

---file1.asp---
<%
'Creating and initializing the array
Dim MyArray()
Redim MyArray(5)
MyArray(0) = "hello"
MyArray(1) = "some other string"

'Storing the array in the Session object
Session("StoredArray") = MyArray

Response.Redirect("file2.asp")
%>

---file2.asp---
<%
'Retrieving the array from the Session Object
'and modifying its second element
LocalArray = Session("StoredArray")
LocalArray(1) = " there"

'printing out the string "hello there"
Response.Write(LocalArray(0)&LocalArray(1))

'Re-storing the array in the Session object
'This overwrites the values in StoredArray with the new values
Session("StoredArray") = LocalArray
%>
 

示例

下列代码将字符串 MyName 分配给名为 name 的会话变量,并给名为 year 的会话变量指定一个值,而且为 some.Obj 组件的实例指定一个名为 myObj 的变量。

Session("name") = "MyName" 
Session("year") = 96 
Set Session("myObj") = Server.CreateObject("someObj") 
 %> 

你可能感兴趣的:(应用服务器,.net,asp.net,asp,IIS)