2009-12-18 12 views
0

Essentiellement, je veux être capable d'attraper quand un utilisateur laisse leur session expirer, puis clique sur quelque chose qui finit par provoquer une publication asynchrone. Je me suis dit que si je mets ce code dans mon Session_Start (en Global.asax) alors je peux attraper un postback qui a eu lieu pendant un délai d'attente de session:Gérer le délai d'attente de session dans asp.net en utilisant Javascript

With HttpContext.Current 
     If TypeOf .Handler Is Page Then 
      Dim page As Page = CType(.Handler, Page) 
      If page IsNot Nothing AndAlso page.IsPostBack Then 
       'Session timeout 
      End If 
     End If 
    End With 

Cela fonctionne très bien. Ma question est, je voudrais être capable d'injecter du javascript dans la réponse, puis appeler Response.End() pour que le reste de l'application ne finisse pas l'exécution. Le problème est que lorsque j'essaye Response.Write("<script ... ") suivi de Response.End() alors javascript n'est pas écrit dans le flux de réponse. Je suis sûr qu'il y a d'autres endroits dans l'application où je peux écrire du Javascript en toute sécurité dans la réponse mais je ne peux pas laisser le reste de l'application s'exécuter car il va erreur quand il essayera d'accéder aux objets de session.

Pour résumer: je dois injecter javascript dans la réponse en cas Session_Start dans Global.asax

Note: Vous demandez peut-être pourquoi je ne fais pas ça dans Session_End ... nous ne sommes pas utilisez les sessions InProc et donc Session_End n'est pas appelé ... mais c'est à côté du point ... je voulais juste expliquer pourquoi je le fais dans Session_Start.

Répondre

1

L'écriture dans le flux de réponse en dehors d'un HttpHandler n'est généralement pas une bonne idée; cela peut fonctionner dans certains cas, mais ce n'est pas ainsi que les choses fonctionnent.

Avez-vous envisagé d'utiliser une classe de base de page ou un adaptateur de page pour cela? De cette façon, vous n'auriez besoin que d'une copie du code, et il pourrait être appliqué à toutes les pages ou seulement à celles que vous sélectionnez.

Une autre option consisterait à utiliser la réécriture d'URL pour rediriger la requête entrante vers une page qui génère la sortie de script dont vous avez besoin.

+0

Merci pour le conseil. Connaissez-vous un moyen de rediriger en toute sécurité sans utiliser Response.Redirect()? La raison pour laquelle je pose la question est parce que nous rencontrons des erreurs chaque fois que nous essayons d'effectuer un Response.Redirect pendant un rappel AJAX (par exemple si Page.IsCallBack est vrai) et dans cette section du code, nous ne devons généralement prendre en charge que le timeout quand c'est un rappel. – Adam

+0

Une approche est la réécriture d'URL, qui est effectuée en appelant context.RewritePath (newPath). Un autre est Server.Transfer (newPath). RewritePath() est le meilleur avant d'arriver à la page, Server.Transfer() est meilleur après cela. – RickNZ

+0

Parfait merci! – Adam