现在正在做一个进度条控件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标准?)没有头绪,希望各位分析一下,看看这是怎么回事,如何解释?
使用了异步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标准?)没有头绪,希望各位分析一下,看看这是怎么回事,如何解释?
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……
我想你应该这么解决问题:ajax提交给服务器不要依靠浏览器默认的sessionid提交方式,你可以直接构造http封包提交过去
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶从字面上分析,个人认为是你的异步处理问题……
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……了~~ 当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……回来……回来……回来……回来……回来……的饿饿444444444
试着重现昨晚的环境
我现在是在单位机器上
进度条数据存储在session中,其生存周期是这样的在访问进度条控件所在页面的时候,对进度条控件render过程中,建立session数据在任务进行中,更新session中的进度数据在ResponsePage页面中,访问session数据,并合成为类似于下面这种格式的数据,返回给xmlhttp调用{StateCode:0,Message:'',Data:{InnerWidth:'114px',Text:'正在处理'}}
在WinForm下委托刷新进度条还要强制执行一下所有事件,否则Windows消息也会有乱了顺序的时候~何况网络请求呼……
另外,浏览器本就是一个单线程的东西,在页面上做异步是为了避免服务器后台处理事件响应时间过长~而上传文件明显是前后台实时交互……
LZ在IE下能正常显示进度已经令我感到很惊讶了~~
当你在一个页面里短时间内发出多个异步请求(还有一个长时间占着线程的上传-_-b),你永远不会知道哪个请求会先回来……你说的有道理,我也怀疑是异步的问题,因为服务端和浏览器均在异步,而IE下,是正常的
所以目前怀疑是FF在执行了文件上传操作后的XMLHTTP调用受到了影响(但我查看HTTP头又发现一致)
难道是影响了ASP.NET的session有效性判定机制?你说的最后一句
确实有这个问题,一个请求在繁忙的上传文件,同时还有一个HTTP请求
虽然第二个请求的目标页面我已经使用异步处理妄图使其立即返回,而且似乎也确实是立即返回了
但数据有错误.....session有问题......
而有时候,确实回不来假如先开始更新进度条,然后提交文件上传,直接挂掉,xmlhttp对象失效,继续分析...
我想你应该这么解决问题:ajax提交给服务器不要依靠浏览器默认的sessionid提交方式,你可以直接构造http封包提交过去我考虑过这个可能,所以在两个页面都输出了sessionID,结果发现一致,没有问题,就是session的内容空了ajax提交的HTTP头我已经全部看过了,没有发现问题谢谢
尝试这样,在浏览器中发送一个请求之后,等待服务器返回,如果没有返回的话,就等下去,有了返回再发送下一个请求,试试看。你说的问题我考虑过,不过现在我在本地调试这个问题不是很严重,再说
我说的乱,不仅仅是数的问题,有时候根本就没有了,session空了,这个可不是顺序的问题了加入在浏览器发请求,等待服务器返回的话,是不是就是XMLHTTP同步调用啊
浏览器会停止渲染死掉的,
楼上各位强人!
我碰到过的问题是Session传递错乱或者丢失
-----------------------------------PS:解决办法,给各个有Session传递的页面地址加入一个随即值
比如:原来为a.aspx?id=1
改为:a.aspx?id=1&Random=12321321321312312312
这样,通过传递页面唯一保证Session唯一!
可能出现的现象--进度条突然飞跳~ 不过没什么人会感到奇怪~毕竟网络也是时快时慢……2、防止页面缓存问题:就是在请求链接后面加上Random()参数;3、服务器异步问题:
如果LZ的请求过程是这样--
上传请求 --- 页面新建服务器线程处理
开始进度条请求 --- 页面线程直接处理
……我没试过,所以不清楚会发生什么……
不过如果你能确保两个线程的Session一致的话,那么返回数据错误就是其他原因造成的,查一下操作Session的部分吧~
FF和IE都没有问题准备哪天抽空把我写这个WEB自定义控件的感受写一下,跟大家分享是不是ASP.net的Session真的对多线程比较敏感?我用的InPro模式准备结贴
详细介绍
http://www.antardev.cn/showArticle.asp?id=34