我在Page_Load上连接启动脚本JavaScript函数,如下所示:
ScriptManager.RegisterStartupScript(Me, GetType(Page), "page_init", "page_init();", True)
此函数调用几个不同的函数来设置页面。其中一个函数会检查document.readyState
并确保它为"complete"
。这涉及图像,我想确保一切都已完全呈现。
if (document.readyState == "complete") {
一切正常,直到我需要将一个字节数组写入输出流(使用Response.BinaryWrite
或Response.OutputStream.Write()
向用户提供文件。之后,document.readyState
为总是“互动的”,直到我离开页面并返回。如果setTimeout(myFunction, 1000);
未完成,我甚至使用了document.readyState
调用来递归调用函数直到它完成。它永远不会达到“完成”。
我已经研究过这个问题很长时间了,并且无法弄清楚这种行为。关于这是如何发生的任何想法?
答案 0 :(得分:5)
为了让ReadyState翻转为Complete,服务器端必须终止连接。
如果查看代码,可能不会在BinaryWrite或WriteToStream方法之后调用Response.End。这是为了刷新响应并提醒客户端已传输所有内容所必需的。
请注意,在进行Response.End调用后,您仍然可以处理数据服务器端,您只是无法向客户端发送更多数据。
如何正确执行此操作的一个很好的示例是A. Russell Jones(google preview here)使用C#掌握ASP.Net的第171页。
它的核心是你应该创建你的流,将它读入字节数组,关闭流,然后做一个BinaryWrite,最后调用Response.End。
答案 1 :(得分:5)
我刚刚发现问题出在IFrame上,我道歉是一个遗留问题的细节。
可以找到更多信息here:
IE(令人惊讶地得到了我的投票 在这里批准)有一个 触发的onreadystatechange事件 每当iFrame的readyState时 财产变化。那个readyState 反映下载的位置 过程内联:最初设置src时 iFrame元素的值, readyState更改为加载。什么时候 该文件已完全下载, readyState更改为交互式。 IE和IE之间的巨大差异 其他浏览器是IE然后改变 readyState属性来完成 当页面(或应用程序)是 满载并为用户做好准备。
附件:这表现相同 对于IE的内联案例,但是 readyState属性永远不会更改为 完成。那不会太多 感觉,因为用户必须手动 双击打开文件 或从某些应用程序中打开它。
答案 2 :(得分:0)
您是否尝试过Response.Close()
而不是Response.End()
之前或之前?在Reflector中比较它们之后,看起来两者是不同的。
答案 3 :(得分:0)
直接写入流时,应将内容长度的http标头设置为正在发送的二进制数据的正确大小。 它可能也是内容类型(multipart / ...)的问题,可能会混淆浏览器。