遇到Session灵异啦,请各位高人进来分析一下
现在正在做一个进度条控件
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标准?)
没有头绪,希望各位分析一下,看看这是怎么回事,如何解释?