2010-10-06 14 views
1

J'ai un gestionnaire, comme celui-ci, en utilisant IRequiresSessionState:Handler avec IRequiresSessionState ne va pas expiration de la session

public class MyHandler : IHttpHandler, IRequiresSessionState 
{ 
    // code 
} 

Dans le code, je suis capable de lire et les valeurs de session définies. Je vérifie également que l'appelant est connecté. Cela fonctionne très bien.

Le site Web utilise l'authentification par formulaire, donc dans le web.config, j'ai ceci:

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" timeout="10" slidingExpiration="true"></forms> 
</authentication> 

Le problème est que AJAX appelle du client vers le code du serveur MyHandler ne prolonge pas la durée de la session!

Ainsi, même si l'utilisateur est occupé à envoyer et à recevoir des données du serveur, il expire 10 minutes après le dernier chargement de sa pleine page.

Dans le gestionnaire, j'ai essayé de modifier spécifiquement une valeur est la session à chaque appel, mais pas même cela prolonge le délai.

Des suggestions?

Répondre

0

Enfin obtenu une solution à ce genre de.

J'ai abandonné la tentative d'obtenir que le gestionnaire fasse le travail, et a appelé à la place une page ASPX normale. Dans cette page, j'ai supprimé le code HTML, et utilisé Response.Write (...) pour renvoyer un certain JSON que je voulais. Cependant, même avec ça, ma session n'était pas prolongée! J'ai enfin réalisé que dans l'événement PreRender, j'ai utilisé Response.ClearHeaders(). C'était le problème. Il s'avère que le système d'authentification Forms mettait à jour le cookie de ticket de session en cas de besoin, mais l'ajoutait aux en-têtes avant l'exécution de mon code. Donc, quand j'ai effacé les en-têtes, j'effaçais le nouveau cookie avant qu'il ne soit envoyé au navigateur. Par conséquent, si vous ne parvenez pas à étendre les sessions, vérifiez que votre code n'utilise pas le ClearHeaders()!