Document.readyState == "complete" est toujours faux. L'état est toujours "interactif"

Je câblage une fonction JavaScript de script de démarrage sur Page_Load pour déclencher comme si:

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

Cette fonction appelle quelques fonctions différentes pour configurer la page. L'une de ces fonctions vérifie le document.readyState Créez l'état et assurez-vous qu'il est "complete" . Cela concerne les images et je veux m'assurer que tout a été entièrement rendu.

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

Tout fonctionne bien, jusqu'à ce que je devrais écrire un tableau d'octets sur outputtream (en utilisant soit Response.BinaryWrite ou Response.OutputStream.Write() pour donner un fichier à un utilisateur. Après cela, document.readyState est toujours "interactif" Jusqu'à ce que je me déplace de la page et de l'arrière. J'ai même utilisé un setTimeout(myFunction, 1000); appelez si document.readyState n'est pas complet pour appeler récursivement la fonction jusqu'à ce qu'elle soit terminée. Elle n'atteint jamais "complete".

Je l'ai déjà étudié pendant quelque temps, et je ne peux pas comprendre ce comportement. Des idées sur la façon dont cela se produit?

Pour que ReadyState retourne à Terminer, le côté serveur doit terminer la connexion.

Si vous regardez votre code, vous n'êtes probablement pas appeler Response.End APRÈS la méthode BinaryWrite ou WriteToStream. Ceci est nécessaire pour rincer la réponse et alerter le client que tout a été transféré.

Notez que vous pouvez toujours traiter le côté du serveur de données après avoir effectué l'appel Response.End, vous ne pouvez envoyer plus de données au client.

Un bon exemple de la façon de procéder correctement est la page 171 de Mastering ASP.Net avec C # par A. Russell Jones ( google preview ici ).

L'écrémage est que vous devez créer votre flux, le lire dans la tablette d'octets, fermer le flux, puis faire un BinaryWrite, puis enfin appeler Response.End.

Je viens de découvrir que le problème est avec un IFrame, que je m'excuse, c'était un détail laissé hors de question.

Vous trouverez plus d'informations ici :

IE (étonnamment obtient mon vote d'approbation ici) Il existe un événement onreadystatechange qui se déclenche chaque fois que la propriété readyState d'iFrame change. That readyState reflète l'endroit où le téléchargement est en cours.

Inline: Lorsque vous définissez initialement la valeur src de l'élément iFrame, readyState change de chargement. Lorsque le fichier a complètement téléchargé, le fichier readyState devient interactif. La grande différence entre IE et les autres navigateurs est que IE modifie alors la propriété readyState pour terminer lorsque la page (ou l'application) est entièrement chargée et prête pour l'utilisateur.

Pièce jointe: Cela se comporte de manière identique au cas en ligne d'IE, mais la propriété readyState ne change jamais pour être complétée. Cela n'a pas beaucoup de sens, puisque l'utilisateur doit ouvrir manuellement le fichier en double-cliquant dessus ou en l'ouvrant à partir d'une application.

Avez-vous essayé d'appeler Response.Close() au lieu ou avant Response.End() ? Après les avoir comparés dans Reflector, il semble que les deux soient différents.

Lors de l'écriture directe dans le flux, vous devez définir l'en-tête http de la longueur de contenu pour la taille correcte des données binaires que vous envoyez. Il pourrait également être un problème avec le type de contenu (multipart / …) qui pourrait confondre le navigateur.