我有以下代码从而重新使用的CookieContainer它记录在所述第一请求,但只使用用于请求该cookie容器之后。

在一段时间内,如果闲置网站会给出一个会话超时,我将需要重新进行登录。

问:能否确定(与cookie容器对象)如果超时发生或者是它最好以确定其是否已经从恰好包含像“会话超时”文本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。如果发生这种情况我设置lastLoggedIn日期为空,然后重新运行搜索方法。

其他提示

可以提取用于使用CookieContainer.GetCookies(串URI)方法的域的所有cookie。使用此CookieCollection你可以得到你感兴趣的cookie,并检查其过期属性,看它是否已过期。

有一件事你应该注意:您的会话可能会结束,即使你的cookie是有效的。 IIS可能会重新启动Web应用程序,并在这种情况下,所有通过认证的用户可能会失去他们的会话数据运行应用程序域。所以检查cookie是一般不足以确保您能登录。

我不知道你想达到什么,但你应该注意到的CookieContainer对。新增(曲奇)和.GetCookies(URI)方法。

中的错误

请参阅的细节和固定位置:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top