如何在重用CookieContainer时使用确定会话超时

时间:2009-06-25 02:03:51

标签: asp.net httpwebrequest httpwebresponse session-timeout cookiecontainer

我有以下代码重用了一个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
        }

3 个答案:

答案 0 :(得分:2)

好吧,由于超时是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日期设置为null并再次运行搜索方法。

答案 1 :(得分:1)

您可以使用CookieContainer.GetCookies(string uri)方法提取域的所有Cookie。使用此CookieCollection,您可以获取您感兴趣的cookie并检查其Expired属性以查看它是否已过期。

您应该注意一件事:即使您的Cookie有效,您的会话也可能会结束。 IIS可能会重新启动Web应用程序运行的应用程序域,在这种情况下,所有经过身份验证的用户可能会丢失其会话数据因此,检查cookie通常不足以确保您保持登录状态。

答案 2 :(得分:0)

我不确定您想要实现的目标,但您应该注意到CookieContainer在.Add(Cookie)和.GetCookies(uri)方法上存在错误。

查看详细信息并在此处修复:

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