2009-07-09 7 views
51

J'ai un HttpHandler qui est exécuté sur une page client (domaine croisé, pas sur notre serveur IIS, etc) et quand ils cliquent sur notre lien incorporé il tire le Handler sur notre serveur. Jusqu'à présent, tout fonctionne normalement.Comment utiliser l'état de session ASP.NET dans un HttpHandler?

J'essaie maintenant d'utiliser l'objet System.Web.HttpContext.Session mais il est null. Je pense que c'est null parce que nous n'avons pas une session jusqu'à ce que notre HttpHandler est invoqué? Et plusieurs appels au gestionnaire créeront une nouvelle session par appel? Si c'est le cas, MS a-t-il simplement désactivé l'objet Session lors de l'appel dans un HttpHandler? Quelqu'un peut-il confirmer cela?

Si c'est le cas, que faites-vous pour maintenir l'état entre les appels? Une sorte d'objet de données SQL? Un fichier?

TIA

Répondre

124

Demandez à votre HttpHandler mettre en œuvre le IRequiresSessionState interface. Cela activera l'utilisation de l'état de session. IRequiresSessionState peut être trouvé dans l'espace de noms System.Web.SessionState.

+1

@ Michael ne serait pas la pensée de cela dans un million d'années merci :) –

+0

mise en œuvre a fonctionné pour moi: Classe publique BasicHandler Met en œuvre IHttpHandler Met en œuvre IRequiresSessionState –

24

Je pense que vous devez implémenter l'interface vide IReadOnlySessionState, de sorte que le contexte sera chargé.

modifier pour ajouter:

Selon la réponse de Michael Morton, vous pouvez également mettre en œuvreIRequiresSessionState, qui vous donnera un accès aussi écrire à l'objet Session

+2

Pour beaucoup HttpHandler utilise IReadOnlySessionState est préférable, au moins quand on ne vérifie que l'état de session n'épargnent pas, mais la principale raison pour cela est la meilleure La réponse est parce qu'un HttpHandler implémente IReadOnlySessionState ou IRequiresSessionState plutôt qu'hérite (les classes peuvent hériter seulement des autres classes). – JackArbiter

-10

essayez d'utiliser le contexte actuel ...

System.Web.HttpContext.Current.Session 
+0

ne fonctionne pas, à moins qu'il met en œuvre l'un des deux interfaces marqueurs –

+1

Session sera null sans IRequiresSessionState/IReadOnlySessionState – Colin

+1

Mon mauvais ... pensait à HttpModules. –

2
using System; 
using System.Web; 
using System.Web.SessionState; 
public class DownloadHandler : IHttpHandler, IReadOnlySessionState 
{ 
    public bool IsReusable { get { return true; } } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Write(context.Session["kmx"]); 
    } 
} 
Questions connexes