Когда использовать Request.Cookies через Response.Cookies?


57

Я использую ответ, когда на событии страницы (например, нагрузка), так как это ответ от ASP.NET, и запрашивать при нажатии кнопки, поскольку это ответ на ASP.NET для обработки? Или есть еще?

39

В веб-приложении запрос - это то, что исходит от браузера, и ответ - это то, что сервер отправляет обратно. При проверке файлов cookie или файлов cookie из браузера вы должны использовать Request.Cookies. Когда вы создаете файлы cookie для отправки в браузер, вам нужно добавить их в Response.Cookies.


95

Они 2 разных вещи, одна Экономят [Ответ], другой ЧИТАЕТ [Запрос]

в Куках (информатике говоря) :) вы сохраните небольшой файл для периода время, который содержит объект типа строки

в рамках .NET вы save a cookie делать:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
DateTime now = DateTime.Now; 

// Set the cookie value. 
myCookie.Value = now.ToString(); 
// Set the cookie expiration date. 
myCookie.Expires = now.AddMinutes(1); 

// Add the cookie. 
Response.Cookies.Add(myCookie); 

Response.Write("<p> The cookie has been written."); 

Вы написали печенье, которое будет доступно в течение одной минуты ... обычно мы делаем now.AddMonth (1), чтобы вы могли сохранить cookie в течение одного месяца.

Для retrieve a cookie, используйте запрос (вы запрашиваете), как:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
myCookie = Request.Cookies["MyTestCookie"]; 

// Read the cookie information and display it. 
if (myCookie != null) 
    Response.Write("<p>"+ myCookie.Name + "<p>"+ myCookie.Value); 
else 
    Response.Write("not found"); 

Помните:

Чтобы удалить Cookie, нет никакого прямого кода, хитрость заключается в том, чтобы Сохраните то же имя файла cookie с датой истечения, которая уже прошла, например, now.AddMinutes (-1)

это удалит файл cookie.

Как вы можете видеть, каждый раз, когда истекает время жизни файла cookie, этот файл автоматически удаляется из системы.

+7

+1 я не понял, вы должны были повторно сохранить куки, чтобы обновить истечения срока 29 апр. 102010-04-29 10:48:05

+2

+1 ясное еще простое объяснение 27 авг. 132013-08-27 12:49:19

+1

Это было в основном полезно, но немного вводит в заблуждение, так как в вашем примере, когда вы переходите на получение файла cookie, вы фактически перезаписываете куки-файл, который был ранее сохранен, с линией 'HttpCookie myCookie = new HttpCookie (« MyTestCookie »); вместо этого используйте что-то вроде« HttpCookie myCookie = new HttpCookie («MyWrittenCookie») ; ' 14 ноя. 132013-11-14 20:16:28

+1

Это не поддерживает чтение файла cookie, который только что был отправлен в ответ, и в этом случае вам нужно использовать' Response.Cookies' 13 окт. 152015-10-13 03:27:17

  0

. Я считаю, что это верно, когда вы программируете код на стороне сервера. для клиентского кода это наоборот. 30 мар. 172017-03-30 08:59:06


4

Печеньки выходят из браузера в коллекции Request.Cookies. Вот где вы читаете куки-файлы, которые были отправлены.

Чтобы отправить cookies обратно в браузер, вы поместите их в коллекцию Response.Cookies.

Если вы хотите удалить файл cookie, вы должны сообщить обозревателю, чтобы удалить его, отправив файл cookie с истечением срока годности. Браузер использует локальное время клиентского компьютера, поэтому, если вы используете время сервера для создания даты, обязательно вычитайте хотя бы один день, чтобы быть уверенным, что он фактически прошел в локальном клиенте.


16

При написании файла cookie используйте Response, но чтение может зависеть от вашей ситуации. Обычно вы читаете из запроса, но если ваше приложение пытается получить только что написанный или обновленный файл cookie, а путешествие туда и обратно не произошло, вам может потребоваться прочитать его форму «Ответ».

Я использую этот шаблон на некоторое время, и он хорошо работает для меня.

public void WriteCookie(string name, string value) 
{ 
    var cookie = new HttpCookie(name, value); 
    HttpContext.Current.Response.Cookies.Set(cookie); 
} 


public string ReadCookie(string name) 
{ 
    if (HttpContext.Current.Response.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Response.Cookies[name]; 
     return cookie.Value; 
    } 

    if (HttpContext.Current.Request.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[name]; 
     return cookie.Value; 
    } 

    return null; 
} 
+4

Альтернативным, но равным подходом было бы просто написать ваш файл cookie в коллекции Response.Cookies AND Request.Cookies при сохранении. Таким образом, любая дальнейшая логика цикла может прочитать cookie, который вы только что установили, не глядя в объект Response. 23 фев. 092009-02-23 00:59:23

  0

Крис, согласился, и я это делал, но недавно я прочитал, что изменение объекта Request является no-no. Попробуем найти ссылку. 23 фев. 092009-02-23 01:11:32

  0

Спасибо, Крис. Эндрю - мне бы хотелось увидеть эту ссылку. Пока я пойду с решением Криса. 09 сен. 092009-09-09 19:30:37

  0

Полезный рисунок, но обратите внимание, что это не 100% поточный сейф 12 сен. 132013-09-12 20:50:52


2

Когда я создаю или обновляю файл cookie в .NET, я обычно делаю это как с коллекцией файлов cookie запросов, так и с ответами. Таким образом, вы можете быть уверены, что если вы попытаетесь прочитать файл cookie дальше по порядку запроса страницы, он будет иметь правильную информацию.

  0

Алекс, эта проблема беспокоила меня весь день. Спасибо, что расчистили его так просто! 09 сен. 092009-09-09 19:29:53

  0

Да, есть некоторые интересные способы, в которых настройка файла cookie в Response также задает его в запросе, если он еще не существует. Но если он уже существует в запросе, установка Response не обновляет Request. Похоже, что функция предназначена для того, чтобы быть полезной, но несколько непоследовательной. Разумеется, при изменении количества файлов cookie в один и тот же запрос вы можете столкнуться с ошибками. 09 июл. 142014-07-09 21:31:02


1

Код Andrew's Code дал ошибку в методе «AllKeys.Contains». Так что я исправил немного ..

public void WriteCookie(string strCookieName, string strCookieValue) 
    { 
     var hcCookie = new HttpCookie(strCookieName, strCookieValue); 
     HttpContext.Current.Response.Cookies.Set(hcCookie); 
    } 


    public string ReadCookie(string strCookieName) 
    {  
     foreach (string strCookie in HttpContext.Current.Response.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Response.Cookies[strCookie].Value; 
      } 
     }   

     foreach (string strCookie in HttpContext.Current.Request.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Request.Cookies[strCookie].Value; 
      } 
     } 

     return null; 
    } 
  0

Вы забыли включить System.Linq? Это исправило ошибку в моем файле. 06 фев. 122012-02-06 16:04:44

  0

Если это только небольшая ошибка, лучше предложить отредактировать исходное сообщение, прежде чем дублировать ответ. 06 дек. 122012-12-06 17:11:46