当IE iframe正接收a.asp(非.NET)大量数据并阻塞这条线程期间,xmlhttp异步或其它如何调用b.asp对Session写标志通知a.asp结束?

freeit100 2008-03-26 04:36:37
(1)
iframe正接收a.asp(非.NET)大量数据并阻塞了这条线程(a.asp调用了VB COM组件返回数据);
a.asp每返回一段数据就判断Session中某标志,若标志等于“stop”就中止返回数据;

(2)
IE6/7浏览器希望通知服务器中止数据发送,希望用xmlhttp异步或其它任何方式调用b.asp对Session写标志“stop”,以便a.asp“安全、正确地”中止;
前提是一定要让服务器a.asp可以读到中止标志。

问题:
我用xmlhttp异步post或get调用b.asp,总是readyState==1,在期间我试验就是写不进Session(该线程被阻塞,不是说IE有两个线程可用吗,怎么第二个就阻塞了~),直到a.asp全部数据返回结束b.asp才继续工作。我怎么办?
注:不要用浏览器端iframe的src="about:blank"的方法。
谢谢!
...全文
189 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
freeit100 2008-04-02
???
回复
freeit100 2008-03-27
没有绝对的长连接,相对而以,指30秒、60秒等。

就是想让长连接该中止时就中止。当ASP看到某stop标志时,可以不再读取数据,可以不再继续返回数据,Response.End就结束了。

当然,是指HTTP/1.0或1.1正常连接时返回正确数据。

继续最初的问题:有什么简单办法上传一个“中止”信号给服务器?
回复
freeit100 2008-03-27
没有绝对的长连接,相对而以,指30秒、60秒等。

就是想让长连接该中止时就中止。当ASP看到某stop标志时,可以不再读取数据,可以不再继续返回数据,Response.End就结束了。

当然,是指HTTP/1.0或1.1正常连接时返回正确数据。

继续最初的问题:有什么简单办法上传一个“中止”信号给服务器?
回复
milizi820 2008-03-27
如果楼主说的长连接一直存并下载数据,
但多线程并不是绝对的同步,就算你改变了session的值,a.asp也不能做到即时的停止吧。

那么a返回的数据也不会是一个字节不差吧
回复
freeit100 2008-03-27
to milizi820:

用纯浏览器(无插件)借助一个HTTP长连接(http long-lived connection)接收Server Push过来的分块数据(例如html、xml等),在今天变得十分有意义,我很希望和大家能找到一种简单的控制方法,最好简单到ASP + iframe + Ajax。

IE6/7在Ajax xhr.readyState==3时是无法读取数据的(必须==4),这就逼迫采用iframe。无论直接了当的iframe,还是嵌入htmlfile内的iframe,这个世界已经给我们能力“变相”让IE6/7 iframe处理ASP Push过来的分块数据(每组“报文”),具体请查询Comet htmlfile。

麻烦在于如何简单控制ASP推过来的数据流,如何“不丢失信息地中止”,这就需要服务器端能获得“中止”请求,而不能浏览器端单方改变iframe的src。在IE6/7一个进程内,一旦iframe阻塞了线程,就出现我最开始提出的问题了。

还是基于简单的ASP(非.NET),如何在iframe接收推送来的数据期间(通俗举例,如正接收聊天消息),能够较简单地告知服务器不要推送后续数据,一个字节都不丢失?

明摆着线程受到阻塞,但还是想和大家“变相”找到可行思路。
回复
milizi820 2008-03-27
asp好像是不支持多线程
不过楼主是要手动修改session还是程序判断去修改呢。
如果程序判断那就有两个表单在同时进行。这应该是不可以的。
那如果是手动的去停止,能不能调入ie的stop功能呢。如果数据下载的数据允许这样的话。
回复
freeit100 2008-03-27
to aCatInNight:

我的现象正是那样。除非下载数据、上传数据分别指向主域和子域(不同domain),例如用两个iFrame试验就可看到。

我希望的是:在相同domain下,一个iFrame正接收a.asp数据期间,怎样能够即刻向b.asp POST数据写进Session(写进Session即可,不必一定等b.asp返回的数据)?
回复
aCatInNight 2008-03-27
a.asp在处理时,整IE窗口不是在等待的吗?这时可以提交b.asp吗
回复
freeit100 2008-03-27
???
回复
freeit100 2008-03-26
关键是:在iframe正在接收服务器a.asp数据、这条线程被其阻塞期间,如何通过另一条线程向b.asp提交中止信息呢?

无论是Server Push分块数据,还是通常的分批发送,ifarme这条线程当前都会被阻塞。当a.asp线程阻塞时,处理b.asp疑似要排队候着。

另外的情况是,不要分块用异步/同步xmlhttp多次AJAX申请每块数据,每次建立连接、会话都会消耗握手时间,要用一次HTTP长连接来接收完全部数据(例如数据都是XML,10MB)。
回复
myvicy 2008-03-26
我是将大量数据拆分分批发送处理,然后在每次发送前判断是否收到了停止的指令.因为dll里的循环似乎对外部的session反应不敏感.
回复
freeit100 2008-03-26
能否赐教?谢谢
回复
myvicy 2008-03-26
以前试过,效果不是很好.
后来换了个方法.
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2008-03-26 04:36
社区公告
暂无公告