2013-11-29 2 views
1

Хорошо, так что это меня заводит. Я написал функцию, которая считывает значение cookie. ЛогикаЧтение только что написанного печенья заставляет печенье быть запертым

  • проверка Response.Cookies в случае, если это только было написано
  • иначе читать из Request.Cookies получить предыдущее значение

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

Что?

Вот код

Обратите внимание на записи происходит в контроллере

public static void PersistCookie(string cookieName, string cookieValue, bool persistent) 
{ 
    var cookie = new HttpCookie(cookieName, cookieValue) 
    { 
     Path = "/", 
     HttpOnly = true, 
    }; 

    if (persistent) 
     cookie.Expires = DateTime.Now.AddMonths(6); 

    HttpContext.Current.Response.SetCookie(cookie); 
} 

Примечания чтение происходит ину частичного вида

public static string ReadCookieValue(string cookieName, bool checkResponseFirst) 
{ 
    if (checkResponseFirst && HttpContext.Current.Response.Cookies[cookieName] != null && 
     HttpContext.Current.Response.Cookies[cookieName].Value.HasValue()) 
      return HttpContext.Current.Response.Cookies[cookieName].Value; 

    return HttpContext.Current.Request.Cookies[cookieName] != null ? HttpContext.Current.Request.Cookies[cookieName].Value : ""; 
} 

Это почти кажется, что только по проверяя, имеет ли файл cookie значение, он все испортит.

Мысли?

+1

Возможно, вы можете позвонить в ReadCookieValue с частичного просмотра или через Ajax? – Andreas

+0

Вы пробовали 'HttpContext.Request.Cookies.Get' вместо использования '[]'? – mrtig

+0

Можете ли вы вставить фрагмент кода, в котором вы настраиваете cookie в своем ответе? Кроме того, каково ожидаемое поведение этой функции, если вы хотите очистить файл cookie? – ohiodoug

ответ

1

Хорошо, так после того, как много больше поиска в Интернете, хороший коллега по работе кулачок с следующей

это выглядит, как я наткнулся курьез в .NET.

проверить эту статью

http://www.codeproject.com/Articles/3106/On-The-Care-and-Handling-of-Cookies

Если вы пытаетесь получить доступ к куки, который не существует в коллекции Response.Cookies, он будет создан с пустой строкой в ​​значении и a Срок действия 01 января-0001 00:00. Как ни странно, он также создает соответствующий файл cookie в коллекции Request.Cookies, если он еще не существует.

Так что, если вы посмотрите на печенье в ответе, то вы косвенно перезаписи куков на компьютере клиента с пустым печеньем, истекают при закрытии браузера

Так что моя проблема решена (или должно быть неразрешимым). Как оказалось, у меня есть обходной путь с помощью ViewBag, но я рад, что не сходил с ума!

Спасибо за помощь

+0

Поздно в игре, но вы могли бы использовать HttpContext.Current.Response.Cookies.AllKeys.Contains(), чтобы сначала проверить, установлен ли файл cookie или нет. –

1

Я не уверен, что вы можете установить куки-файлы в частичные виды. При настройке файла cookie с Response.SetCookie информация возвращается браузеру в поле SetHookie HTTPHeader. Я не думаю, что частичные представления могут установить это значение, попробуйте проверить ответ своих приложений с помощью Fiddler2 после вызова Response.SetCookie.

Обычно я устанавливаю свои файлы cookie с помощью простого Javascript.

+0

Спасибо за обновление. Я фактически устанавливаю cookie в контроллере и пытаюсь прочитать его в частичном представлении - так что, возможно, проблема в том, что-то еще в конце концов. Опять же, чтобы прояснить, когда я пытаюсь прочитать куки-файл, который не установлен на этой серверной поездке, он очищает файл cookie, который был установлен в предыдущей поездке. Так запутался .... –

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