CookieContainerを再利用するときに使用するセッションタイムアウトを決定する方法
-
22-07-2019 - |
質問
最初のリクエストにログインするCookieContainerを再利用する次のコードがありますが、その後のリクエストにはCookieコンテナのみを使用します。
しばらくして、アイドル状態のサイトでセッションタイムアウトが発生した場合、再度ログインする必要があります。
Q:タイムアウトが発生したかどうかを(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の日付をnullに設定し、検索メソッドを再度実行します。
他のヒント
CookieContainer.GetCookies(string uri)メソッドを使用して、ドメインのすべてのCookieを抽出できます。このCookieCollectionを使用すると、関心のあるCookieを取得し、そのExpiredプロパティをチェックして、有効期限が切れているかどうかを確認できます。
注意すべき点が1つあります。Cookieが有効であっても、セッションが終了する場合があります。 IISは、Webアプリケーションが実行されているアプリドメインを再起動する場合があり、その場合、認証されたすべてのユーザーがセッションデータを失う可能性があります。そのため、通常、Cookieを確認するだけではログイン状態を維持するには不十分です。
何を達成したいかはわかりませんが、CookieContainerには.Add(Cookie)および.GetCookies(uri)メソッドにバグがあることに注意してください。
詳細を確認し、ここで修正します:
http:// dot -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html