2010-11-23 429 views
5

我一直在试验将清除所有在HttpContext.Response中的cookie的代码。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 }); 
} 

然而,这将有OutOfMemoryException因为for循环永远不会退出错误 - 每次添加一个cookie的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还是那些刚刚在服务器上创建的cookie。

Response.Cookies包含服务器将发回的cookie。
此集合开始为空,应更改为修改浏览器的Cookie。

文档状态:

ASP.NET包括两个内在的cookie 集合。访问 通过Cookie集合 HttpRequest包含由客户端发送到Cookie头中的 服务器的Cookie 。通过 集合访问的 集合HttpResponse 包含在 服务器上创建并在Set-Cookie标头中发送到客户端 的新Cookie。

后您使用 HttpResponse.Cookies集合添加一个cookie,该 饼干是 HttpRequest.Cookies收集立即可用,即使 如果响应尚未发送到 客户端。如果你做出for循环运行向后


你的第一个代码示例应该工作。
新的cookie将在结束后添加,所以向后循环会忽略它们。