2

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

3 に答える 3

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

于 2009-06-25T05:25:06.393 に答える
1

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

注意すべき点が1つあります。Cookieが有効であっても、セッションが終了する場合があります。IISは、Webアプリケーションが実行されているアプリドメインを再起動する場合があります。その場合、認証されたすべてのユーザーがセッションデータを失う可能性があります。したがって、Cookieをチェックするだけでは、通常、ログインしたままでいることを確認するのに十分ではありません。

于 2009-06-25T07:20:24.790 に答える
0

何を達成したいのかわかりませんが、CookieContainer には .Add(Cookie) および .GetCookies(uri) メソッドにバグがあることに注意してください。

詳細を確認し、ここで修正してください。

http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

于 2009-10-08T13:29:35.313 に答える