Frage

Ich habe den folgenden Code, der erneut verwendet ein Cookie, die auf der ersten Anfrage anmeldet, aber nur verwende den Cookie Behälter für Anforderungen nach.

Nach einer gewissen Zeit, wenn nicht zuvor die Seite wird eine Session-Timeout geben, ich muss das Login erneut auszuführen.

F: Kann ich (mit dem Cookie Containerobjekt) festzustellen, ob das Timeout passiert ist oder ist es am besten, um zu bestimmen, ob es aus der HttpWebResponse passiert ist, die wie ‚Session-Timeout‘ zu Text enthalten passiert. Was ist der beste Weg, dies zu tun?

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

Und dann diese Methode ruft zum Container:

        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
        }
War es hilfreich?

Lösung

Nun, da das Timeout 30 Minuten ist, ich habe die Login Spiel nach 25 Minuten zu wiederholen.

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

Als zusätzliche Vorsichtsmaßnahme, überprüfe ich die Httpresponse für den Text, der zurückkehrt, wenn die Seite Sitzung abläuft (obwohl sie jetzt erwartet wird dies nicht zu sehen). Wenn dies der Fall ich das lastLoggedIn Datum festgelegt wieder die Suchmethode auf null und ausgeführt werden.

Andere Tipps

Sie können alle Cookies extrahieren für eine Domäne der CookieContainer.GetCookies (string uri) Methode verwendet wird. diese Cookie verwenden, können Sie das Cookie Sie daran interessiert sind zu erhalten und überprüfen Sie die Expired Eigenschaft, um zu sehen, wenn es abgelaufen ist.

Es ist eine Sache, sollten Sie Folgendes beachten: Ihre Sitzung beenden kann, auch wenn Ihr Cookie gültig ist. IIS kann die Anwendungsdomäne neu starten die Web-Anwendung läuft in und in diesem Fall alle authentifizierten Benutzer ihre Sitzungsdaten verlieren können. Also die Cookie Überprüfung ist in der Regel nicht genug, um sicherzustellen, dass Sie angemeldet bleiben.

Ich bin nicht sicher, was Sie erreichen wollen, aber Sie sollten feststellen, dass Cookie einen Fehler auf .Add (Cookie) hat und .GetCookies (uri) -Methode.

, um die Details sehen und beheben hier:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top