سؤال

ولقد التعليمات البرمجية التالية التي تعيد يستخدم CookieContainer الذي يسجل في بناء على طلب الأول، ولكن يستخدم فقط الحاوية الكعكة لطلبات بعد.

وبعد فترة من الزمن إذا الخمول الموقع سوف تعطي مهلة الدورة، وسوف تحتاج إلى تنفيذ تسجيل الدخول مرة أخرى.

س: هل يمكنني تحديد (مع كائن حاوية الكعكة) إذا لم يحدث المهلة أو من الأفضل أن تحديد ما إذا كان قد حدث من HttpWebResponse الذي صادف أن يحتوي على نص مثل "مهلة جلسة. ما هي أفضل طريقة للقيام بذلك؟

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

وبعد ذلك يدعو هذا الأسلوب إلى الحاوية:

        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
        }
هل كانت مفيدة؟

المحلول

حسنا، منذ المهلة هي 30 دقيقة، وأنا قد وضعت تسجيل الدخول لتكرار بعد 25 دقيقة.

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

وكإجراء وقائي إضافي، أتحقق من HttpResponse للنص والتي ترجع عندما مهلة جلسة الصفحة من (على الرغم المتوقعة الآن لن ينظر إلى هذا). وإذا حدث ذلك I تحديد موعد lastLoggedIn فارغة وتشغيل أسلوب البحث مرة أخرى.

نصائح أخرى

ويمكنك استخراج كافة ملفات تعريف الارتباط لمجال استخدام CookieContainer.GetCookies (سلسلة اوري) الأسلوب. استخدام هذا CookieCollection يمكنك الحصول على الكعكة كنت مهتما في وتحقق ممتلكاتها انتهت لمعرفة ما اذا كان قد انتهت صلاحيتها.

وهناك شيء واحد يجب ملاحظة: جلستك قد ينتهي حتى لو الكعكة الخاص بك هو صالح. IIS قد أعد مجال التطبيق تشغيل التطبيق على شبكة الإنترنت في وفي هذه الحالة جميع المستخدمين المصادق عليهم قد تفقد البيانات جلسة العمل الخاصة بهم. حتى التحقق من الكعكة بشكل عام لا يكفي لضمان أن لا تخرج آليا.

وأنا لست متأكدا ما تريد تحقيقه، ولكن يجب أن تلاحظ أن CookieContainer لديها خلل في. إضافة (كوكي) و.GetCookies (أوري) الأسلوب.

واطلع على تفاصيل وإصلاح هنا:

HTTP: // نقطة -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top