Question

J'ai le code suivant qui réutilise un cookieContainer qui se connecte à la première requête, mais utilise simplement le conteneur de cookies pour les requêtes suivantes.

Après un certain temps, si le site est inactif, le délai de session est expiré. Je devrai me connecter à nouveau.

Q: Puis-je déterminer (avec l’objet conteneur cookie) si le délai a expiré ou s’il est préférable de déterminer s’il s’agit du type HttpWebResponse contenant un texte du type "délai de session". Quelle est la meilleure façon de faire cela?

        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;
        }
    }

Ensuite, cette méthode appelle le 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
        }
Était-ce utile?

La solution

Dans la mesure où le délai d'attente est de 30 minutes, je souhaite configurer le login pour qu'il se répète au bout de 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;
        }
    }

Par mesure de précaution supplémentaire, je vérifie la réponse HttpResponse pour le texte qui s'affiche lorsque la session de la page arrive à expiration (bien que cela ne soit pas attendu, cela ne sera pas visible). Si cela se produit, définissez la date lastLoggedIn sur null et réexécutez la méthode de recherche.

Autres conseils

Vous pouvez extraire tous les cookies d'un domaine à l'aide de la méthode CookieContainer.GetCookies (string uri). 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 que vous devriez noter: votre session peut se terminer même si votre cookie est valide. IIS peut redémarrer le domaine d'application dans lequel l'application Web s'exécute et, dans ce cas, tous les utilisateurs authentifiés risquent de perdre leurs données de session. Donc, vérifier le cookie ne suffit généralement pas pour rester connecté.

Je ne sais pas trop ce que vous souhaitez réaliser, mais vous devriez remarquer que CookieContainer a un bogue dans les méthodes .Add (Cookie) et .GetCookies (uri).

Voir les détails et résoudre le problème ici:

http: // point -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top