遇到Session灵异啦,请各位高人进来分析一下

bingdian37 2007-11-20 02:51:12
现在正在做一个进度条控件

WEB自定义控件内嵌js资源,浏览器端是XMLHTTP异步请求实时数据,服务端调用自定义控件的静态方法来更新进度和给浏览器返回实时数据

异步请求用是SetTimeout循环调用XmlHttp组件的open方法,确认标志为异步了,这个请放心

服务端有个ResponsePage.ashx文件,为了防止用户进行艰巨任务的时候,将会话所在线程阻塞
使用了异步HTTP处理方法,开线程,这样确实受同一会话里的其他任务影响很小,可以及时的返回进度

我在测试的时候,是直接在ResponsePage.ashx中更新进度条,然后返回实时数据的

而进度条的实时数据在服务端是存储在session中的一个结构体

前面声明了,因为是调用的静态方法,而且是在ashx中调用的静态方法
所以要获取session首先应该加上IRequiresSessionState接口,在方法内部访问session时,我用了两种方法

因为异步调用时,他会传入一个Httpcontext对象,我在异步调用的静态方法中是用的这个参数
还有个用于同步调用的方法,是用HttpContext.Current获取的当前Context,然后访问session

[我怀疑问题就在这个地方]

default.aspx为测试页面,有一个文件上传框,一个按钮
点击按钮的时候,先提交表单(开始上传),然后启动进度条更新脚本

=========================================================================下面是我遇到的情况
IE浏览器可以正常使用,即使在浏览器cpu占用非常高,服务器cpu占用也非常高的时候,进度条还可以是不是更新一下,基本可用

而firefox下....
一会儿出现个异常,
在这行代码这里:ProgressBarStatus _Status = (ProgressBarStatus)context.Session[ProgressBarId];
添加监视后发现,session里面是空的

我就想啊,怎么会是空的呢?

研究了半天没搞懂,就用try catch将这段有异常的过去了,并在catch里面给session赋值(一段错误描述,融进进度条结构体中了)

没想到啊,我手工访问那个ResponsePage.ashx出现了这样的情况

我刷新一次:出现我子定义的错误信息
我再刷新一次:进度条数字正常增长,并且是一直在正常增长...
似乎有两个session一样

这还好些,后来更蹊跷的事情发生了
我点击default页面的按钮,提交表单并开始更新进度条后
一开始是一秒一个错误
后来是一秒错误,下一次就是正确的进度条增长

再后来,出现进度条波动啦,就是说这样的(举个例子)
本来应该是 1,5,10,15,20
现在成了 1,10,5,15,10,20,15
左右摆动前进啊


但是这一切在IE浏览器里是正常的

我用HTTP嗅探器看过了,两个浏览器对于ResponsePage的访问是一致的
而上传文件时的TCP数据包,我只截取了firefox的,IE的还没有分析,暂时没有对比结果

感觉是Firefox的文件上传机制把ASP.NET的Session机制给搞乱了,(不也是HTTP标准?)

没有头绪,希望各位分析一下,看看这是怎么回事,如何解释?


...全文
369 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingdian37 2007-11-30
  • 打赏
  • 举报
回复
用于asp.net2.0的实时WEB进度条控件

刚写好

感兴趣的可以看看

本控件使用XMLHTTP组件在浏览器端异步请求进度条实时数据,同时由特定的Http Module进行快速响应,不会因为用户的高负载操作而轻易失去响应,或者阻塞。可以根据不同的使用场景对进度条进行适当调整以完成实时进度显示任务。


详细介绍
http://www.antardev.cn/showArticle.asp?id=34
bingdian37 2007-11-21
  • 打赏
  • 举报
回复
再次感谢

基本抛弃session,留了个sessionID用

线程已经用不到了^_^,所以线程池也就用不到了,谢谢
bingdian37 2007-11-21
  • 打赏
  • 举报
回复
谢谢各位的关心

后来又出现个问题

线程争夺资源

就是处理主要任务的线程,和返回实时进度条数据的线程争夺CPU资源

我处心积虑想在他们两个和平共处平起平坐的基础上解决这个问题,无奈那主要任务线程太霸道

没办法,只有不跟他争了,骑到他头上去解决了,呵呵

0xff 2007-11-20
  • 打赏
  • 举报
回复
1、处理异步返回问题:丢弃错误的和过期的返回(即进度只增不减),最后返回成功标志或者根据错误次数判断失败;
可能出现的现象--进度条突然飞跳~ 不过没什么人会感到奇怪~毕竟网络也是时快时慢……

2、防止页面缓存问题:就是在请求链接后面加上Random()参数;

3、服务器异步问题:
如果LZ的请求过程是这样--
上传请求 --- 页面新建服务器线程处理
开始进度条请求 --- 页面线程直接处理
……

我没试过,所以不清楚会发生什么……
不过如果你能确保两个线程的Session一致的话,那么返回数据错误就是其他原因造成的,查一下操作Session的部分吧~
bwangel 2007-11-20
  • 打赏
  • 举报
回复
就偶的经验,session只在页面间传递数据不会出问题,在本页自提交,一般用Viewstate
LGame 2007-11-20
  • 打赏
  • 举报
回复
清空本地缓存
LGame 2007-11-20
  • 打赏
  • 举报
回复
把session设的时间长一些!!!
qq22345111 2007-11-20
  • 打赏
  • 举报
回复
只能说
楼上各位强人!
我碰到过的问题是Session传递错乱或者丢失
-----------------------------------

PS:解决办法,给各个有Session传递的页面地址加入一个随即值
比如:原来为a.aspx?id=1
改为:a.aspx?id=1&Random=12321321321312312312
这样,通过传递页面唯一保证Session唯一!
xiaoku 2007-11-20
  • 打赏
  • 举报
回复
呵呵...
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
CloneCenter

就像楼上又写些朋友说的那样,既然是异步调用,你可能没有办法知道他什么时候返回了上一次的查询结果。有可能是后请求的数据,最先被发回来了。
尝试这样,在浏览器中发送一个请求之后,等待服务器返回,如果没有返回的话,就等下去,有了返回再发送下一个请求,试试看。


你说的问题我考虑过,不过现在我在本地调试这个问题不是很严重,再说
我说的乱,不仅仅是数的问题,有时候根本就没有了,session空了,这个可不是顺序的问题了

加入在浏览器发请求,等待服务器返回的话,是不是就是XMLHTTP同步调用啊
浏览器会停止渲染死掉的,
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
yuan74521940,cceon,honey52570,yhy0611,liuyun1987等网友

谢谢你们的热心

我也想改简单一点,让大家看着舒服些,不过发现CSDN不给我机会啊,没法编辑

抱歉
Love_My 2007-11-20
  • 打赏
  • 举报
回复
帮你顶好了..

... 连广告也来了
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
ladOnTheBrinkOfRage

我猛一看回复那么多字,好兴奋啊,再一看,都是重复的,呵呵
CloneCenter 2007-11-20
  • 打赏
  • 举报
回复
就像楼上又写些朋友说的那样,既然是异步调用,你可能没有办法知道他什么时候返回了上一次的查询结果。有可能是后请求的数据,最先被发回来了。
尝试这样,在浏览器中发送一个请求之后,等待服务器返回,如果没有返回的话,就等下去,有了返回再发送下一个请求,试试看。
lwl0376 2007-11-20
  • 打赏
  • 举报
回复
帮顶
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
wanghui0380

你说你用HTTP嗅探器探过,把截获的封包放出来看看

估计有可能是ajax提交时,回传给服务器的sessionId乱了
我想你应该这么解决问题:ajax提交给服务器不要依靠浏览器默认的sessionid提交方式,你可以直接构造http封包提交过去


我考虑过这个可能,所以在两个页面都输出了sessionID,结果发现一致,没有问题,就是session的内容空了

ajax提交的HTTP头我已经全部看过了,没有发现问题

谢谢
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
0xff

从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……


你说的有道理,我也怀疑是异步的问题,因为服务端和浏览器均在异步,而IE下,是正常的
所以目前怀疑是FF在执行了文件上传操作后的XMLHTTP调用受到了影响(但我查看HTTP头又发现一致)
难道是影响了ASP.NET的session有效性判定机制?

你说的最后一句
确实有这个问题,一个请求在繁忙的上传文件,同时还有一个HTTP请求
虽然第二个请求的目标页面我已经使用异步处理妄图使其立即返回,而且似乎也确实是立即返回了
但数据有错误.....session有问题......
而有时候,确实回不来

假如先开始更新进度条,然后提交文件上传,直接挂掉,xmlhttp对象失效,

继续分析...
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
ustbwuyi:

我session中的数据,,是通过一个静态方法进行设置的
进度条数据存储在session中,其生存周期是这样的

在访问进度条控件所在页面的时候,对进度条控件render过程中,建立session数据

在任务进行中,更新session中的进度数据

在ResponsePage页面中,访问session数据,并合成为类似于下面这种格式的数据,返回给xmlhttp调用

{StateCode:0,Message:'',Data:{InnerWidth:'114px',Text:'正在处理'}}
bingdian37 2007-11-20
  • 打赏
  • 举报
回复
ajax的session提交是没有问题的,所有ajax的HTTP头,我都跟过了,包括IE和FF中

正在监视asp.net计数器中的session total,session active
试着重现昨晚的环境
我现在是在单位机器上



wanghui0380 2007-11-20
  • 打赏
  • 举报
回复
我觉得你应该去依靠一个全局的静态集合对象比较实际,比如一个静态hashtable,初始时利用sessionid做key,加入hashtable,客户端直接用get方式提交sessionid,服务器根据sessionid访问hashtable,执行完了把hashtable的那个key给删掉

这个东东,其实还有细节可以挖,比如可以开线程池,服务器去访问线程中的变量,只要线程不挂,你就能访问的到
加载更多回复(22)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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