服务器上的所有网站后台有时登陆后马上超时退出了,怎么回事???

z6611 2005-07-18 10:03:11
服务器上网站登陆大概都是用session的

是常常这样,登了好几次也登不进的,在好的时候所有网站都好的,

这跟服务器的什么设置有关??win2003

程序没问题的,登不进的时候在很多电脑试过都不行,跟客户端应该也没关系吧
...全文
777 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakalong 2005-07-18
  • 打赏
  • 举报
回复
Session丢失原因与解决方案小结- -

可能的原因1:

win2003 server下的IIS6默认设置下对每个运行在默认应用池中的工作者进程都会经过20多个小时后自动回收该进程,造成保存在该进程中的session丢失。
因为Session,Application等数据默认保存在运行该Web应用程序的工作者进程中,如果回收工作者进程,则会造成丢失。

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

可能的原因2:

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

解决办法:
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"/>
2. 我们同时还要在SessionStateServer 服务器中启动ASP.NET State Service服务,具体设置:控制面板>>管理工具>>服务>>ASP.NET State Service,把它设为自动启动即可。
3. 每台前端WEB服务的Microsoft“Internet 信息服务”(IIS)设置
要在 Web 场中的不同 Web 服务器间维护会话状态,Microsoft“Internet 信息服务”(IIS) 配置数据库中 Web 站点的应用程序路径(例如,\LM\W3SVC\2)与 Web 场中所有 Web 服务器必须相同。大小写也必须相同,因为应用程序路径是区分大小写的。在一台 Web 服务器上,承载 ASP.NET 应用程序的 Web 站点的实例 ID 可能是 2(其中应用程序路径是 \LM\W3SVC\2)。在另一台 Web 服务器上,Web 站点的实例 ID 可能是 3(其中应用程序路径是 \LM\W3SVC\3)。因此,Web 场中的 Web 服务器之间的应用程序路径是不同的。我们必须使Web 场Web 站点的实例 ID 相同即可。可以在IIS中把某一个WEB配置信息保存为一个文件,其他Web 服务器的IIS配置可以来自这一个文件。
kakalong 2005-07-18
  • 打赏
  • 举报
回复
关于web应用程序的范围与session变量丢失问题的深入研

引言:最近不少网友都有这样的疑问,就是当我们在一个网页间设定了一个session变量后,到另一个网页,却消失了。这
是什么样的原因呢。如果你详细的读完本文,相信能给你一个完整的答复!

一:前言--关于web应用程序

我们今天所讨论的web 应用程序是指由Windows NT Option Pack 提供的一个建立 Internet 或Intranet的 Web应用程
序的平台。而Web 应用程序可以作为一组 Web 页交付使用,它们向封装了事务逻辑并提供访问存储重要商业信息的数据库
应用程序和 ActiveX 组件提供用户界面。也就是我们使用的asp程序。
创建应用程序时,必须用 Internet 服务管理器在 Web 站点中指定应用程序的启动点目录。在发现其他启动点之前,
Web 站点某启动点目录下的每个文件和目录被视为是应用程序的一部分。因此,可以使用目录边界定义应用程序的范围。
基于 ASP 的应用程序是 ASP 页和 ActiveX 组件的集合。当用户定义应用程序时,将使用 IIS指定用户的 Web 站点中
应用程序启动点的目录。在用户的 Web 站点中每个位于启动点目录下的文件和文件夹都被认为是应用程序的一部分,直到
发现另外的启动点目录为止。这样,用户就可以使用目录作为边界定义应用程序的作用域。每个 Web 站点可以有多个应用
程序,而每个应用程序的配置都可以不同。

二:web应用程序的范围

正如上面的定义所提到的。我们将一个web应用程序,如:购物程序,新闻程序,聊天程序......等这样一些我们开发
的asp页面单独集中来成为一个web应用程序。结合实例来说,如我们将一个购物程序的所有页面(如:注册页面,购物
车,收银台,订单页面,商品页面)统一起来,统称为一个web购物程序,它的应用程序范围就是从购物开始购物结束所涉
及到的所有页面。而在iis中,系统须将其分配到一个虚拟目录中去,而该虚拟目录的所有页面,及其子目录就是其购物程
序的物理范围。如下表所示。
*shop—index.asp
—buy.asp
+catalog—list.asp
+customer—a.asp
—b.asp
其中*号,代表的是一个虚拟目录,+代表的是其中的子目录。所以,整个上面的所有页面构成了一个web应用程序。但是,
也可以在一个虚拟目录下建立另一个应用程序。如下表
*shop—index.asp
—buy.asp
*book—book.asp
+catalog—list.asp
+customer—a.asp
—b.asp
这样,shop下的index.asp,list.asp,a.asp等属于一个应用程序,而book下的book.asp则不属于shop,他是一个新的web应
用程序。

三:web应用程序范围的设置与应用

如果你的开发环境是Visual InterDev6.0,那么,应用程序的设置几乎不用你费心去考虑,一切有VI6来给你设置好
了,并在IIS中自动建立了虚拟目录,但如果是其他的话,你可能需要在IIS中自己去设定他。具体步骤如下:
创建应用程序
1--在“Internet 服务管理器”中,选择作为应用程序启动点的目录。可以将 Web 站点的主目录指定为 应用程
序的启动点。
2--打开该目录的属性页,然后单击“主目录”、“虚拟目录”或“目录”选项卡。
3--在“名称”文本框中,为应用程序键入名称。'当然,应用程序的名称也不是必要的。但推荐设定。
4--单击“创建”按钮。
此后,你就可以将你的web应用程序目录映射到该目录下即可。
明白以上的基本定义,对我们网络开发人员十分必要,应为,正是由于有了一个web应用程序的范围,才可以使web应用
程序能够在应用程序的文件间共享信息,例如,ASP 应用程序可在其网页间共享环境流、会话状态和变量设置。也就是我
们经常使用的session,application对象等。应为只有规定了一个应用程序及其范围,session,application等对象才有意
义。

四:session变量“丢失”的问题

谈到了那么多的概念,终于可以说道实质性的问题了,session对象是web应用程序中最重要的对像之一,正是它的存
在,使得我们可以在跨网页间传送数据,分辨不同用户成为可能。我们只要将变量制定给session即可实现。这一过程即
session("temp")=temp即可。但最近不少网友都有这样的疑问,就是当我们在一个网页间设定了一个session变量后,到另
一个网页,却消失了。这是什么样的原因呢。
根据上面的概念,我们可以将其原因,和处理办法总结如下。
1:asp网页跨了多个web应用程序:
这个原因就是你的另一个网页可能是另一个web应用程序。以前,一些资料过分的强调了会话变量的单一性,好像一个
用户连接到一个web主机之后,只可能创建一个会话变量,这是不对的,分辨会话变量的依据正是我们上面所提到的web应
用程序范围,而不是单独根据用户而建立的,你可以试一试下面的一段代码。
test.asp
<% @ language=vbscript %>
<%
session("temp")="temp"
Response.Write session.SessionID 'sessionID用来分辨一个应用程序间的单独客户。
%>

将test.asp分别拷贝到两个不同的虚拟目录下。你就可以看到,他是两个不同的值了。所以,可能你的网页跨了不同的应
用程序。
当然,这种情况对于初学者可能碰到,对于有经验的人可能犯的是这样的错误,即他们本身为一个根目录,但在制定虚
拟目录时将其子目录又设为一个虚拟目录了,就如同我们上面提到的第二个表结构一样。这样他同样成为了两个不同的web
应用程序。也就不难解释为什么会出错了。

2:可能是启动了多个同一应用程序。
第一种情况很好发现,也容易改正,但这第二种情况就不容易发现,也较难改正。这里我们引入一个另一个的概念。多
个同一应用程序共存,(好长呀,关键是微软的概念我忘了,这个是我自己起的。呵呵!),它的意思从这个定义上很好
理解,就是对于同一个应用程序。同一时间可以在内存中存在多个。如我们常见的acdsee.exe,你可以通过点击启动多个
acdsee.exe。而另外一种则不能,我们就不说它的定义了(如果说的话,就是相同应用程序不共存,呵呵!)在同一时间
内,如果已经启动了一个应用程序,则不能再启动相同的应用的应用程序了。如foxmail.exe,当你启动了一个
foxmail.exe后,就只可能在内存中存在一个foxmail.如果你在启动,则不会再开一个foxmail窗口了。
而我们的ie属于前者,你可以通过点击ie,启动多个ie应用程序。此时,我们做下面另一个测试。你将上面的代码
test.asp放入一个虚拟目录中。然后,你点击ie启动(注意:是通过点击Ie启动,不是按CTRL+N,也不是在一个ie窗口点
击文件,重新打开一个窗口)此时,你可以发现,他们虽然是同一个地址,同一个用户,但sessionID还是不同的,当然,
你还可以建另一个文件。如
test2.asp
<% @ language=vbscript %>
<%
response.write session("temp")
%>
这时,你在另一个ie窗口下,你就会发现session("temp")为空,也就是说,我们刚才明明在test.asp中附了值,而且
test2.asp和test.asp在同一虚拟目录下,但session("temp")却丢失了。原来,相对于相同的asp应用程序。不同的ie相对
的却是不同的asp应用程序。(有点像绕口令难懂是吧。)不过,我们已经明白了它的起因,相信不难解决他。
这里还要注意的是,我们刚才一再提到的是通过点击Ie,而不是通过按CTRL+N,也不是在一个ie窗口点击文件,重新
打开一个窗口,这里要说明的是如果你通过在一个ie窗口打开的窗口,它属于派生窗口,而不是共生窗口,就是说,此时
的另一个窗口属于和其上一个窗口是继承关系,属于同一个应用程序范围。
3:连接不当
其实,大部分的网友碰到的问题是通过点击页面中的连接新开窗口而发现session变量丢失的。他同按ctrl+N新开窗口
的意义相同。但此时为什么会出问题呢?我们来分析一下它的连接方式。可能为<a href="xx.asp" traget=_blank>click
me </a>通过这样点击的连接同ctrl+n 是相同的,应该不会出问题。还有一种连接式通过脚本控制的如
window.open "xx.asp","name","toolbar=no"这样的代码,他就可能发生这样的问题。如果通过点击ie开了多个共生窗口
(许多网友为了节省时间,他们喜欢开多个窗口。比如我。)。就是他可能在新开的窗口中如果含有相同的name的窗口。
则此时,就可能发生连接不当导致session丢失,其实,原因还是通第二种一样。还有一种更极端的方式开新窗口,通过用
document.write 在一个脚本中动态写出新的页面,而该页面的url是不存在的,这样就更可能出问题了,应为session正是
通过url,http来追踪的。所以如果其页面地址是动态的话。则session就根本无法追踪了。

相信通过以上例子的分析,可能会解释你在应用session中出现的大部分问题。但不是全部(如过你禁用cookie的话,
呵呵!)但是,如果你将以上的概念都弄懂,则可以解决你在应用session中出现的所用问题了。
kakalong 2005-07-18
  • 打赏
  • 举报
回复
关于session丢失原因的分析
很多session丢失的原因是因为错误的程序或者是错误的虚拟目录结构。

SessionID 的改变有下面几个原因。

原因一:

Netscape的浏览器会认为"/App/user.asp"跟"/app/user.asp"是两个不同的程序
。它会自动地开始一个新的会话期(new session)。所以,才你的网站上一定要统
一字母的大小写。

原因二:

另外一个是原因是 Session.Timeout 的值。

Timeout这个属性是用来设置Session的超时时间的,一分钟为单位。假如一个用
户,在一个Timeout的时间内没有刷新或者请求页面,那么会话就会结束(the se
ssion ends)。当你再次请求页面的时候,一个新的会话有会开始。

确信Timeout的值,是分钟的。

格式: Session.Timeout [ = nMinutes]

原因三:

假如用户把他们的浏览器的cookie关了,当然session就不能保持。因为session
的保持是要靠cookie的。


要保持Session的状态,浏览器就必须支持cookie,而且在打开的状态。
你当然可以用其他的方法

原因四:

常犯的错误就是,建立了错误的目录结构。
像下面的目录结构:
root 放了global.asa
\virtual_root 没有global.asa
\another_virtual_root 没有global.asa

调用两个virtual roots的页面,就会执行相同的global.asa(root上的那个)

另外的一个目录结构:
root 没有global.asa
\virtual 放了global.asa
\another_virtual_root 另外一个global.asa

每一个不同目录下的global.asa都会各自执行,当然执行的代码就不同了。不过
如果里面的代码一样,就令当别说。:)

所以你在请求不同目录下页面,将会导致不同的global.asa被执行。不同的变量
被调用,不同的session id被建立....之前的有用的信息都被
破坏了。

下面是详细的解释:

当你先浏览子虚拟程序上的页面(child virtual application),然后再去浏览子
虚拟程序的上一级的父虚拟程序(parent virtual root)的页面。那些变量就会丢
失、破坏。看下面的表格:

请求 子程序1丢失 子程序2丢失
先请求Root 不会 不会
只在子程序1之前请求Root 不会 会
只在子程序2之前请求Root 会 不会
最后请求Root 会 会


有一个注册表的键值(registry entry),叫CheckForNestedVroots(缺省为 1)。是
设ASP是否去检测其他目录里的global.asa文件。

假如一个页面被请求,但是如果在这个被请求页面的同一目录里没有global.asa
这文件,那么asp就会去上级的目录里找。ASP设计就是这样的。另一方面,假如
application被请求的页面是在root的话,而global.asa也在root,那么ASP就会执
行这个在root上的global.asa文件。没有必要去找子目录下的global.asa文件了



Internet 服务管理器,可以把一个目录设成虚拟的目录,这样的目录是可以拥有
自己的global.asa文件,当然Application_OnStart和Session_OnStart是少不了
的(废话)。

这是个例子。他们都有Global.asa

C:\InetPub\wwwroot <Home>
Global.asa
C:\InetPub\wwwroot\Test2 (Nested)
Global.asa
C:\InetPub\wwwroot\Test2\Test3 (Nested)
Global.asa
C:\InetPub\wwwroot\Test4
Global.asa

注意:

如果Global.asa文件web请求时是要求认证的话,那么在Global.asa文件的Sessi
on_onStart过程里初始化的变量将会是空的。如果你的global.asa的权限真的是
这样设的话,那么将会带来很多的麻烦。例如你会见到这样的错误信息:

Microsoft OLE DB Provider for ODBC Drivers error '80004005
[Microsoft][ODBC Driver Manager] Data source name not found and no def
ault driver specified
/<web name>/<asp filename>.asp, line xx

这就是因为Session_onStart里面初始化的session变量是空的(根本就没有初始化
)。

另外:这个问题在win95上不存在。更准确的是说,像在FAT这样的,没有文件权
限设置的文件系统里,没有这样的问题。所以NT的NTFS是有这样问题的但,win9
5,98的就没有。

所以,你必须为Global.asa文件设置Internet匿名读取的权限,这样才保证问题
不会发生。
z6611 2005-07-18
  • 打赏
  • 举报
回复
服务器不稳定而出现的问题
这个能不能具体些?
kakalong 2005-07-18
  • 打赏
  • 举报
回复
原因1:不是同一个页面(你开新窗口了) session 必须是同一个窗口(不关闭的窗口)
原因2:服务器不稳定而出现的问题
原因3:session是一类特殊的cookie。 如果你完全禁止了cookie session也会失效
shixianyong 2005-07-18
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/community/Column/47.mspx

6,850

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧