2009-08-01 5 views
0

Quelqu'un peut-il m'aider à trouver la solution du problème suivant.ASP.NET 2.0: problème dans Httpcontext.current.session.add()

  1. Dans le site web ASP.NET: à l'événement Application_OnPostAuthenticate(), quel que soit le code i écriture est exécutée pour chaque demande. Par conséquent, en raison de cet objet customidentity, countryid et weatherid sont appelés à chaque fois pour chaque requête (appel de la base de données pour la valeur). Il affecte le temps de réponse de la page et exécute le code inutile.

    vide Application_OnPostAuthenticateRequest (expéditeur d'objet, EventArgs e) {

    // Get a reference to the current User 
    
    IPrincipal objIPrincipal = HttpContext.Current.User; 
    
    // If we are dealing with an authenticated forms authentication request 
    
    if ((objIPrincipal.Identity.IsAuthenticated) && (objIPrincipal.Identity.AuthenticationType == "Forms")) 
    { 
        CustomPrincipal objCustomPrincipal = new CustomPrincipal(); 
        objCustomPrincipal = objCustomPrincipal.GetCustomPrincipalObject(objIPrincipal.Identity.Name); 
        HttpContext.Current.User = objCustomPrincipal; 
        CustomIdentity ci = (CustomIdentity)objCustomPrincipal.Identity;    
        HttpContext.Current.Cache["CountryID"] = FatchMasterInfo.GetCountryID(ci.CultureId); 
        HttpContext.Current.Cache["WeatherLocationID"] = FatchMasterInfo.GetWeatherLocationId(ci.UserId); 
        Thread.CurrentPrincipal = objCustomPrincipal; 
    } 
    

    }

Pour résoudre ce problème lorsque je tente tochange code comme suit HttpContext.Current.Session.Add ("test", FatchMasterInfo.GetWeatherLocationId (ci.UserId);); à la place du cache j'ai trouvé l'erreur de remplissage "La réfrence d'objet n'est pas définie sur l'instance de l'objet"

Je ne sais pas si nous pouvons stocker la variable de session dans l'événement Application_OnPostAuthenticate() ou non?

Répondre

2

Vous pouvez essayer de faire un peu plus tard dans la demande, comme dans le cas PreRequestHandlerExecute:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
{ 
    IPrincipal objIPrincipal = HttpContext.Current.User; 
    if ((objIPrincipal.Identity.IsAuthenticated) && (objIPrincipal.Identity.AuthenticationType == "Forms")) 
    { 
     HttpSessionState session = HttpContext.Current.Session; 
     CustomPrincipal objCustomPrincipal = new CustomPrincipal(); 
     if (session[objIPrincipal.Identity.Name] == null) 
     { 
      // get data from database or wherever 
      objCustomPrincipal = objCustomPrincipal.GetCustomPrincipalObject(objIPrincipal.Identity.Name); 
      CustomIdentity ci = (CustomIdentity)objCustomPrincipal.Identity; 
      Object countryID = FatchMasterInfo.GetCountryID(ci.CultureId); 
      Object weatherLocationID = FatchMasterInfo.GetWeatherLocationId(ci.UserId); 
      // save in session (not cache as cache is application-wide, not per-user): 
      session.Add(objIPrincipal.Identity.Name, objCustomPrincipal); 
      session.Add(objIPrincipal.Identity.Name + "_CountryID", countryID); 
      session.Add(objIPrincipal.Identity.Name + "_WeatherLocationID", weatherLocationID); 
     } 
     else 
     { 
      // already have custom principal object in session 
      objCustomPrincipal = (CustomPrincipal)session[objIPrincipal.Identity.Name]; 
     } 

     // set the custom principal object to context/thread 
     HttpContext.Current.User = objCustomPrincipal; 
     Thread.CurrentPrincipal = objCustomPrincipal; 
    } 
} 
+0

@ironsam, Merci beaucoup. J'ai peu plus de questions à propos de la même 1. En utilisant GetCustomPrincipalObject() je récupère les rôles et les autorisations de l'utilisateur connecté. C'est une bonne pratique pour trouver des rôles et des permissions ici ou nous devons changer de code et le placer ailleurs. 2. Pourquoi l'événement sessionstart n'est pas le bon endroit pour session.add()? Pendant ce temps, j'applique la solution que vous avez fournie. J'espère que le problème sera résolu. –

+0

Edit: @ironsam, j'ai essayé la solution que vous fournissez. lorsque j'obtiens un utilisateur sur la page ASPX en utilisant le code suivant CustomIdentity ci = HttpContext.Current.User.Identity comme CustomIdentity; La valeur de ci est nulle. Je ne me trompe pas? –

+0

Vous devriez pouvoir obtenir le CustomIdentity de l'objet de session si vous avez besoin sur la page aspx: CustomPrincipal pi = (CustomPrincipal) session [objIPrincipal.Identity.Name]; CustomIdentity ci = (CustomIdentity) pi.Identity; En ce qui concerne les meilleures pratiques et lorsque certains événements se produisent dans une requête, cela peut aider . – ironsam

1

Vous ne voulez probablement pas d'accéder à la session en tout état de cause qui se passe dans chaque demande. Certaines demandes n'ont même pas de session (par exemple, beaucoup d'appels de service Web, ou des appels à WebResource.axd qui chargent des ressources statiques).

0

L'état de session peut ne pas être activé. Cela fonctionne-t-il ailleurs (comme dans l'affichage d'un formulaire Web)?

Recherchez un élément <sessionState> sous votre élément system.web dans web.config assurez-vous qu'il est activé (définissez-le sur InProc sauf si vous avez une batterie de serveurs Web).

1

Avant d'ajouter de la valeur à l'objet de cache, vérifiez s'il existe déjà dans le cache.