2010-11-23 5 views
5

私はHttpContext.Responseのすべてのクッキーをクリアするコードを試しています。HttpContext.Request.CookiesとHttpContext.Response.Cookiesの関係

は当初、私はこれを使用:

DateTime cookieExpires = DateTime.Now.AddDays(-1); 

for (int i = 0; i < HttpContext.Request.Cookies.Count; i++) 
{ 
    HttpContext.Response.Cookies.Add(
     new HttpCookie(HttpContext.Request.Cookies[i].Name, null) { Expires = cookieExpires }); 
} 

forループが終了したことがないので、しかし、これはOutOfMemoryExceptionとエラーになります - あなたはResponseにクッキーを追加するたびに、それはまた `リクエストに追加されます。

次のアプローチは動作しますので、

DateTime cookieExpires = DateTime.Now.AddDays(-1); 

List<string> cookieNames = new List<string>(); 

for (int i = 0; i < HttpContext.Request.Cookies.Count; i++) 
{ 
    cookieNames.Add(HttpContext.Request.Cookies[i].Name); 
} 

foreach (string cookieName in cookieNames) 
{ 
    HttpContext.Response.Cookies.Add(
     new HttpCookie(cookieName, null) { Expires = cookieExpires }); 
} 

HttpContext.Request.CookiesHttpContext.Response.Cookiesとの関係は正確に何ですか?

答えて

11

Request.Cookiesには、ブラウザがサーバーに送信するCookieと、サーバー上で作成したばかりのCookieの両方が含まれます。

Response.Cookiesには、サーバーが返すクッキーが含まれています。
このコレクションは空の部分から始まり、ブラウザのCookieを変更するために変更する必要があります。

ドキュメントの状態:

ASP.NET 2つの固有のクッキー のコレクションが含まれています。コレクションに にアクセスし、Cookiesコレクションの HttpRequestには、クッキーヘッダー内の サーバーにクライアントによって送信されたクッキー が含まれています。 コレクションの HttpResponse のCookieコレクションには、 サーバーで作成され、Set-Cookieヘッダーのクライアント に送信された新しいCookieが含まれています。

あなたは HttpResponse.Cookiesコレクションを使用してクッキーを追加した後、応答がクライアントを するために送信されていない場合、 クッキーは HttpRequest.Cookiesコレクション、でも ですぐに利用可能です。あなたはforループが後方に実行させる場合


あなたの最初のコードサンプルは動作するはずです。
新しいクッキーは最後の後に追加されるので、後方のループはそれらを無視します。