2009-07-30 21 views
5

estoy cableado de un script de inicio de la función JavaScript en Load al fuego, así:document.readyState == "complete" es siempre falso. El estado es siempre "interactivo"

ScriptManager.RegisterStartupScript(Me, GetType(Page), "page_init", "page_init();", True) 

Esta función llama a un par de diferentes funciones para configurar la página. Una de esas funciones comprueba el document.readyState y se asegura de que sea "complete". Esto trata de imágenes y quiero asegurarme de que todo se haya procesado por completo.

if (document.readyState == "complete") { 

Todo funciona bien, hasta que tengo que escribir una matriz de bytes a la OutputStream (usando Response.BinaryWrite o Response.OutputStream.Write() para dar un archivo a un usuario. Después de eso, el document.readyState siempre es "interactivo", hasta que navego Incluso he usado una llamada setTimeout(myFunction, 1000); si document.readyState no está completa para llamar recursivamente a la función hasta que se complete. Nunca llega a "completa".

He investigado esto por algún tiempo, y no puede entender este comportamiento. ¿Alguna idea de cómo está sucediendo esto?

+0

Ejecuta el script en el lado del servidor o del lado del cliente. Si está ejecutando el script en el lado del servidor, entonces es normal, ya que sigue esperando que el script finalice. – BYK

Respuesta

5

Acabo de enterarme de que el problema es con un IFrame, lo que me disculpo fue un detalle que quedó fuera de la cuestión.

Más información se puede encontrar here:

IE (sorprendentemente tiene mi voto de aprobación aquí) hay un evento que dispara onreadystatechange siempre que sea del iFrame readyState cambios de propiedad. Ese readyState refleja dónde está la descarga en el proceso .

En línea: cuando establece inicialmente el valor src del elemento iFrame, el readyState cambia a la carga.Cuando el archivo se ha descargado por completo, el readyState cambia a interactivo. La gran diferencia entre IE y el otros navegadores es que IE luego cambia la propiedad readyState para completar cuando la página (o aplicación) es completamente cargada y lista para el usuario.

adjuntos: Esto comporta de forma idéntica al caso línea de IE, pero la propiedad readyState nunca cambia a completa. Eso no haría mucho sentido , ya que el usuario tiene que manualmente abrir el archivo haciendo doble clic en él o abriéndolo desde alguna aplicación.

5

Para que ReadyState cambie a Completo, el lado del servidor debe finalizar la conexión.

Si mira su código probablemente no llame a Response.End después del método BinaryWrite o WriteToStream. Esto es necesario para descargar la respuesta y alertar al cliente de que todo se ha transferido.

Tenga en cuenta que aún puede procesar el lado del servidor de datos después de realizar la llamada Response.End, simplemente no puede enviar más datos al cliente.

Un buen ejemplo de cómo hacerlo correctamente es la página 171 de Mastering ASP.Net con C# por A. Russell Jones (google preview here).

La tuerca de esto es que deberías crear tu transmisión, leerla en la matriz de bytes, cerrar la secuencia, luego hacer una escritura binaria y finalmente llamar a Response.End.

+0

Llamo a Response.End después de escribir el archivo. Intentaría enviar más datos al cliente después de Response.End causar esto? –

+0

Tal vez ... Sin embargo, creo que Response.End cierra la conexión con el navegador. Por lo tanto, cualquier intento de enviar más datos * debería * fallar. Dicho eso, no lo hagas. ;) – NotMe

0

¿Ha intentado llamar al Response.Close() en lugar del Response.End() o antes? Después de compararlos en Reflector, parecería que los dos son diferentes.

+0

Interesante. ¿Por casualidad trazaste para ver cuáles eran las diferencias? – NotMe

0

al escribir directamente en la secuencia, debe establecer el encabezado http de longitud de contenido al tamaño correcto de los datos binarios que está enviando. También podría ser un problema con el tipo de contenido (multiparte/...) que podría confundir el navegador.

Cuestiones relacionadas