2

J'ai le code suivant qui réutilise un CookieContainer qui se connecte à la première requête, mais qui utilise simplement le conteneur de cookies pour les demandes suivantes.Comment déterminer le délai d'attente de session lors de la réutilisation de CookieContainer

Après une période de temps si inactif le site donnera un délai de session, je devrai effectuer la connexion à nouveau. Q: Puis-je déterminer (avec l'objet conteneur de cookie) si le délai d'attente s'est écoulé ou est-il préférable de déterminer si cela s'est produit à partir de HttpWebResponse qui contient du texte comme 'session timeout'. Quelle est la meilleure façon de procéder?

 private static CookieContainer _cookieContainer; 
    private static CookieContainer CurrentCookieContainer 
    { 
     get 
     { 
      if (_cookieContainer == null || _cookieContainer.Count == 0) 
      { 
       lock (_lock) 
       { 
        if (_cookieContainer == null || _cookieContainer.Count == 0) 
        { 
         //_cookieContainer.GetCookies(
         _cookieContainer = DoLogin(); 
        } 
       } 
      } 

      return _cookieContainer; 
     } 
     set 
     { 
      _cookieContainer = value; 
     } 
    } 

Et cette méthode appelle au conteneur:

 public static string SomeMethod(SomeParams p) 
     { 
      HttpWebRequest request_thirdPartyEnquiryDetails = (HttpWebRequest)WebRequest.Create(thirdPartyEnquiryDetails); 
      CookieContainer cookieContainer = CurrentCookieContainer; 
      request_thirdPartyEnquiryDetails.CookieContainer = cookieContainer; 
//... and it goes on to submit a search and return the response 
     } 

Répondre

2

Eh bien, puisque le délai d'attente est de 30 minutes, j'ai mis la connexion à répéter après 25 minutes.

private static DateTime? lastLoggedIn; 

    private static CookieContainer _cookieContainer; 
    private static CookieContainer CurrentCookieContainer 
    { 
     get 
     { 
      if (_cookieContainer == null || _cookieContainer.Count == 0 || !lastLoggedIn.HasValue || lastLoggedIn.Value.AddMinutes(25) < DateTime.Now) 
      { 
       lock (_lock) 
       { 
        if (_cookieContainer == null || _cookieContainer.Count == 0 || !lastLoggedIn.HasValue || lastLoggedIn.Value.AddMinutes(25) < DateTime.Now) 
        { 
         _cookieContainer = DoLogin(); 
         lastLoggedIn = DateTime.Now; 
        }       
       } 
      } 

      return _cookieContainer; 
     } 
     set 
     { 
      _cookieContainer = value; 
     } 
    } 

Comme précaution supplémentaire, je vérifie la HttpResponse pour le texte qui retourne lorsque les temps de session page (bien que son attend maintenant ce ne sera pas visible). Si cela se produit, définissez la date lastLoggedIn sur null et réexécutez la méthode de recherche.

+0

Cela devrait fonctionner, mais rappelez-vous que vous déconnectera même si votre cookie n'a pas expiré –

1

Vous pouvez extraire tous les cookies pour un domaine à l'aide de la méthode CookieContainer.GetCookies (chaîne de caractères). En utilisant cette CookieCollection vous pouvez obtenir le cookie qui vous intéresse et vérifier sa propriété Expired pour voir si elle a expiré.

Il y a une chose à noter: Votre session peut se terminer même si votre cookie est valide. IIS peut redémarrer le domaine d'application dans lequel s'exécute l'application Web et, dans ce cas, tous les utilisateurs authentifiés peuvent perdre leurs données de session. Donc vérifier le cookie n'est généralement pas suffisant pour s'assurer que vous restez connecté.

+0

Ok, merci encore – CRice

Questions connexes