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