2012-05-31 3 views
2

Я обычно не играю с Cookies, но я хотел изучить этот вариант, который я обычно использую для переменных Session.Cookies не установлены быстро

Если я установил Cookie, а затем попытаюсь прочитать его, я не получу значение, которое я только что установил.

Однако, если я обновляю страницу или закрываю браузер и открываю его резервную копию, Cookie будет настроен.

Я отлаживаю это в Chrome. Разве это имеет значение?

public const string COOKIE = "CompanyCookie1"; 
private const int TIMEOUT = 10; 

private string Cookie1 { 
    get { 
    HttpCookie cookie = Request.Cookies[COOKIE]; 
    if (cookie != null) { 
     TimeSpan span = (cookie.Expires - DateTime.Now); 
     if (span.Minutes < TIMEOUT) { 
     string value = cookie.Value; 
     if (!String.IsNullOrEmpty(value)) { 
      string[] split = value.Split('='); 
      return split[split.Length - 1]; 
     } 
     return cookie.Value; 
     } 
    } 
    return null; 
    } 
    set { 
    HttpCookie cookie = new HttpCookie(COOKIE); 
    cookie[COOKIE] = value; 
    int minutes = String.IsNullOrEmpty(value) ? -1 : TIMEOUT; 
    cookie.Expires = DateTime.Now.AddMinutes(minutes); 
    Response.Cookies.Add(cookie); 
    } 
} 

Ниже, как я использую его:

public Employee ActiveEmployee { 
    get { 
    string num = Request.QueryString["num"]; 
    string empNum = String.IsNullOrEmpty(num) ? Cookie1 : num; 
    return GetActiveEmployee(empNum); 
    } 
    set { 
    Cookie1 = (value != null) ? value.Badge : null; 
    } 
} 

Это, как я зову его, где Request.QueryString["num"] возвращает NULL так что Cookie1 читается из:

ActiveEmployee = new Employee() { Badge = "000000" }; 
Console.WriteLine(ActiveEmployee.Badge); // ActiveEmployee is NULL 

... но чтение от Cookie1 также возвращает null.

Есть ли такая команда, как Commit(), которую мне нужно вызвать, чтобы сразу было доступно значение cookie?

ответ

2

Чтобы добавить другие ответы, вы можете обойти эту проблему путем кэширования значения в приватной переменной в случае, если куки не был обновлен еще:

private string _cookie1Value = null; 
private string Cookie1 { 
    get { 
    if (_cookie1Value == null) 
    { 
     // insert current code 
     _cookie1Value = cookie.Value; 
    } 
    return _cookie1Value; 
    } 
    set { 
    // insert current code 
    _cookie1Value = value; 
    } 
} 
+0

+1, должно быть 'else { // вставить текущий код _cookie1Value = cookie.Value; return _cookie1Value; } –

+0

Кроме того, возможно, хотите установить cookie в Response.Cookies в сеттер. –

+1

@ChrisShain: Спасибо, я перестроил и упростил геттер. Что касается вашего второго комментария, это то, что '// вставить текущий код' в сеттер. – mellamokb

5

При установке куки в ответ он не получает магически транспортируются в запрос коллекции на печенье. Это ответ, вы можете проверить его там, но он не появится в объекте запроса, пока он не будет отправлен из браузера в следующем запросе.

6

Cookies не похожи на Session- есть два коллекций печенья, а не один.

Request.Cookies != Response.Cookies. Первый - это набор файлов cookie, которые отправляются из браузера, когда они запрашивают страницу, последняя - это то, что вы отправляете обратно с контентом. Это раскрывает характер файлов cookie cookie, в отличие от сеанса, который является чисто конструкцией Microsoft.

+0

Вы, ребята, быстрые! Итак, должен/я могу написать этот файл cookie в коллекцию «Request.Cookies»? (FYI: Я пробовал это, но он все еще не показывал мою ценность до тех пор, пока я не обновил страницу) – jp2code

+0

Вам не следует пытаться записать его в Request.Cookies - это для чтения значения, которое было отправлено из браузера. Читайте по запросу, пишите в ответ. –

1

Чтобы просто положить его; Файл cookie, установленный в ответ, будет доступен только для следующего запроса htpp (следующее действие get или post из браузера).

Подробно: Когда значение cookie задано в HttpResponse, оно будет сохранено/сохранено только тогда, когда после ответа клиент получит доступ (это означает, что браузер прочитает значение cookie из заголовка Http Response и сохранит его). Таким образом, технически только для запросов впредь он будет доступен. Например, когда пользователь нажимает на ссылку или кнопку, которая вызывает вызов сервера после этого цикла из браузера.

Надеюсь, это даст вам некоторую идею, я предлагаю вам прочитать, что куки и ASP.NET обертывают перед использованием.

 Смежные вопросы

  • Нет связанных вопросов^_^