Domanda

Ho il seguente codice che riutilizza un CookieContainer che accede alla prima richiesta, ma utilizza solo il contenitore dei cookie per le richieste successive.

Dopo un periodo di tempo se inattivo il sito darà un timeout di sessione, dovrò eseguire nuovamente l'accesso.

D: Posso determinare (con l'oggetto contenitore cookie) se si è verificato il timeout o è meglio determinare se si è verificato da HttpWebResponse che contiene testo come 'timeout della sessione'. Qual è il modo migliore per farlo?

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

E quindi questo metodo chiama il contenitore:

        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
        }
È stato utile?

Soluzione

Bene, poiché il timeout è di 30 minuti, ho impostato il login per ripetere dopo 25 minuti.

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

Come ulteriore precauzione, controllo HttpResponse per il testo che ritorna quando scade la sessione della pagina (anche se ora è previsto che non si vedrà). Se ciò accade, ho impostato la data lastLoggedIn su null ed ho eseguito nuovamente il metodo di ricerca.

Altri suggerimenti

Puoi estrarre tutti i cookie per un dominio usando il metodo CookieContainer.GetCookies (string uri). Usando questo CookieCollection puoi ottenere il cookie che ti interessa e controllare la sua proprietà Scaduta per vedere se è scaduto.

C'è una cosa che dovresti notare: la tua sessione potrebbe terminare anche se il tuo cookie è valido. IIS potrebbe riavviare il dominio dell'app in cui viene eseguita l'applicazione Web e in tal caso tutti gli utenti autenticati potrebbero perdere i dati della sessione. Pertanto, controllare il cookie in genere non è sufficiente per rimanere connessi.

Non sono sicuro di ciò che vuoi ottenere, ma dovresti notare che CookieContainer ha un bug sul metodo .Add (Cookie) e .GetCookies (uri).

Vedi i dettagli e correggi qui:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top