質問

最初のリクエストにログインする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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top