2

我有下面的代碼重新使用CookieContainer登錄第一個請求,但只是使用cookie容器請求後。如何確定重新使用CookieContainer時使用會話超時

經過一段時間如果閒置網站會給會話超時,我將需要再次執行登錄。

問:我可以確定(使用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 
     } 

回答

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日期設置爲空,並再次運行搜索方法。

+0

這應該工作,但要記住,你可能會被註銷,即使你的cookie尚未到期再 – 2009-06-25 07:21:04

1

您可以使用CookieContainer.GetCookies(string uri)方法提取域的所有cookie。使用這個CookieCollection,你可以得到你感興趣的cookie,並檢查它的Expired屬性是否已過期。

有一點你應該注意:即使你的cookie有效,你的會話也可能會結束。 IIS可能會重新啓動Web應用程序運行的應用程序域,在這種情況下,所有經過身份驗證的用戶可能會丟失其會話數據因此,檢查cookie通常不足以確保您保持登錄狀態。

+0

好的,謝謝 – CRice 2009-06-26 07:12:55