2011-01-26 42 views
3

ページへのログインを処理するためのHttpListenerクラスがあり、正常にCookieを設定できますが、セッション終了時にCookie拡張子が期限切れです、クッキーがセッションクッキーであることを示します)。ここでは、コードスニペットがある:限り、私は問題なくクッキーにアクセスすることができ、同じセッションで午前ようC#HttpListener有効期限が設定されていてもセッション後にCookieが期限切れになる

CookieCollection ccol = new CookieCollection();  
Cookie loginCookie = new Cookie(); 

loginCookie.Name = "login"; 
loginCookie.Value = "loggedin"; 
loginCookie.Expires = DateTime.Now.AddMinutes(60); 
ccol.Add(loginCookie); 
context.Response.Cookies = ccol; 

+0

あなたは、ヘッダーのネットワークトレースを投稿できますあなたのログインページがクライアントに返ってきていますか?ヘッダーを見ることで、何が起こっているのかを簡単に診断することができます。 –

答えて

3

通常、クッキーコレクション(Cookies)プロパティは読み取り専用です(少なくともASP.NET Response.Cookiesプロパティを使用している場合)。

HttpListenerを使用してからしばらくお待ちください。独自のCookieコレクションを割り当てる前にCookiesコレクションがnullであるかどうか知っていますか?そうでない場合は、単純にクッキーコレクションではなくクッキーを追加することができますか?

編集:

私はHttpListenerを使用してテストウェブサーバを構築し、これは私が見つけたものです。 あなたがクッキーを設定すると、HTTPヘッダは次のようになります。

のSet-Cookie:それは本当にのようなものである必要があり、一方、ユーザ名= SHIV

のSet-Cookieユーザー名= shiv; 期限切れ= 2011年2月27日00:45:41 GMT; パス=/

だから今はバグのようですか?

[OK]を、クッキーのExpiration時間はGMT時間として設定する必要があります:私は

は編集2 ...深く掘るとあなたが知ってもらおう。 ASP.NETはこれを利用しますが、この場合は適切な形式を自分で使用する必要があります。予想通り手動でHTTPヘッダーを設定

は動作します:

contextHttpListenerContextある
context.Response.Headers.Add("Set-Cookie", 
"username=shiv; expires=Thu, 27-Jan-2011 00:45:41 GMT; path=/"); 

これはHttpListenerを使用して(セッションではない)クッキーを設定する唯一の方法のようです。あなたは、私が提案ルートを下る場合、正しく日付をフォーマットするために、このDateTimeフォーマット文字列を使用することができます。

var cookieDate = DateTime.UtcNow.AddMinutes(60d).ToString("dddd, dd-MM-yyyy hh:mm:ss GMT"); 
+0

提案をいただきありがとうございました。私はそれを拡張して解決することができました。 –

+1

ありがとうございました。期待通りに動作しないCookieコードを公開したとは思えません。私は彼らがSetSessionCookie()メソッドを呼び出して、明白になることを望みました。私はHttpListenerの設定されたクッキー機能が壊れていることを知る前に、私が間違って何かをしているに違いないと思って、これを長年にわたって戦った。 BTW:あなたはMをエスケープしない限り、日付の書式文字列にGMTを含めることはできません。それ以外の場合は月に変換されます。 –

+0

ToString形式と必要な日付形式にはいくつかの不一致があります(https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx)。また@Steve HinerはGMTの 'M'が翻訳されたと言っている。 'AddMinutes'の' d'も余分です。正しい文字列形式については、@Mike J.の回答を参照してください(問題の原因を見つけるのには良い仕事ですが、:-) – SharpC

2

次の操作を行って、それを解決:

string cookieDate = DateTime.UtcNow.AddMinutes(60).ToString("ddd, dd-MMM-yyyy H:mm:ss"); 

context.Response.Headers.Add("Set-Cookie", "cookieName=cookieValue;Path=/;Expires=" + cookieDate + " GMT"); 
関連する問題