Como determinar Session Timeout usando ao reutilizar CookieContainer
-
22-07-2019 - |
Pergunta
Eu tenho o seguinte código que reutiliza um CookieContainer que estabelece conexão com o primeiro pedido, mas só usa o contêiner de cookie para pedidos depois.
Depois de um período de tempo se inactivo o site vai dar um tempo limite de sessão, vou precisar para realizar o login novamente.
Q: Can I determinar (com o objeto recipiente cookie) se o tempo limite que aconteceu ou é melhor para determinar se ele tem acontecido desde o HttpWebResponse que passa a contém texto como 'tempo limite da sessão'. Qual é a melhor maneira de fazer isso?
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;
}
}
E, em seguida, este método chama para o recipiente:
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
}
Solução
Bem, já que o tempo de espera é de 30 minutos, que eu pus o login para repetir após 25 minutos.
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;
}
}
Como uma precaução extra, eu verifico o HttpResponse para o texto que retorna quando a sessão página a sair (embora o seu agora esperava por isso não será visto). Se isso acontecer eu definir a data lastLoggedIn como nulo e executar o método de busca novamente.
Outras dicas
Você pode extrair todos os cookies para um domínio usando o método CookieContainer.GetCookies (String URI). Usando este CookieCollection você pode obter o cookie que você está interessado e verificar a sua propriedade Expirado para ver se ele expirou.
Há uma coisa que você deve observar: Sua sessão pode terminar mesmo que o cookie é válido. IIS pode reiniciar o domínio de aplicativo do aplicativo da Web é executado e, nesse caso, todos os usuários autenticados podem perder seus dados da sessão. Assim, verificando o cookie, geralmente não é suficiente para garantir que você permanecer ligado.
Eu não tenho certeza do que você quer alcançar, mas você deve perceber que CookieContainer tem um bug no .Add (Cookie) e .GetCookies (URI) método.
Veja os detalhes e correção aqui:
http: // dot -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html