Отношения между HttpContext.Request.Cookies и HttpContext.Response.Cookies - PullRequest
6 голосов
/ 23 ноября 2010

Я экспериментировал с кодом, который удалит все файлы cookie в HttpContext.Response.

Изначально я использовал это:

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, он также добавляется в `Request.

Работает следующий подход:

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.Cookies и HttpContext.Response.Cookies?

1 Ответ

12 голосов
/ 23 ноября 2010

Request.Cookies содержит полный набор файлов cookie, как тех, которые браузер отправляет на сервер, так и тех, которые вы только что создали на сервере.

Response.Cookies содержит файлы cookie, которые сервер отправит обратно.
Эта коллекция изначально пуста и должна быть изменена для изменения файлов cookie браузера.

В документации указано:

ASP.NET включает в себя два встроенных cookie коллекции. Доступ к коллекции через коллекцию Cookies HttpRequest содержит куки передается клиентом сервер в заголовке Cookie. доступ к коллекции через Коллекция куки HttpResponse содержит новые куки, созданные на сервер и передается клиенту в заголовке Set-Cookie.

После добавления файла cookie с помощью HttpResponse.Cookies коллекция, печенье сразу доступно в HttpRequest. Коллекция печенья, даже если ответ не был отправлен клиент.


Ваш первый пример кода должен сработать, если вы выполните цикл for в обратном направлении.
Новые куки будут добавлены после окончания, поэтому обратный цикл будет игнорировать их.

...