2

我有以下代码,它重新使用在第一个请求时登录的 CookieContainer,但之后只使用 cookie 容器进行请求。

一段时间后,如果站点空闲,则会出现会话超时,我将需要再次执行登录。

问:我能否确定(使用 cookie 容器对象)是否发生超时,或者最好从 HttpWebResponse 中确定它是否发生,该 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
        }
4

3 回答 3

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 并再次运行搜索方法。

于 2009-06-25T05:25:06.393 回答
1

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

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

于 2009-06-25T07:20:24.790 回答
0

我不确定你想要实现什么,但你应该注意到 CookieContainer 在 .Add(Cookie) 和 .GetCookies(uri) 方法上有一个错误。

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

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

于 2009-10-08T13:29:35.313 回答