2

次のコードでCookieContainerを再利用していますが、最初のリクエストではログインした後にリクエストにCookieコンテナを使用します。CookieContainerを再利用するときのセッションタイムアウトの決定方法

アイドル状態であれば一定の時間が経過した後、サイトでセッションタイムアウトが発生するため、再度ログインする必要があります。

Q:タイムアウトが発生した場合、または 'session timeout'のようなテキストが含まれているHttpWebResponseから発生したかどうかを判断するのが最善である場合は、Cookieコンテナオブジェクトを使用して判断できますか。これを行う最善の方法は何ですか?

 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 
     } 

答えて

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に設定して検索メソッドを再度実行します。

+0

これは動作しますが、あなたはあなたのクッキーが再び –

1

CookieContainer.GetCookies(string uri)メソッドを使用すると、ドメインのすべてのCookieを抽出できます。このCookieCollectionを使用すると、興味のあるCookieを取得し、Expiredプロパティが期限切れになっているかどうかを確認できます。

メモする必要があることがあります。セッションがCookieが有効であっても終了することがあります。 IISは、Webアプリケーションが実行されるアプリケーションドメインを再起動する可能性があり、その場合、認証されたすべてのユーザーがセッションデータを失う可能性があります。だから、クッキーをチェックすると、ログインしたままにしておくのが一般的ではありません。

+0

[OK]を、おかげで期限切れになっていない場合でも、ログアウトすることができることを覚えておいてください – CRice

関連する問題