Cookies и ASP.NET сводят меня с ума - PullRequest
3 голосов
/ 14 февраля 2010

Я создал простое приложение для корзины покупок. Нам нужно что-то конкретное для наших нужд, длинная история. В любом случае, я сохраняю объект корзины в файле cookie. Это отлично работает, но у меня проблемы с удалением файла cookie корзины из класса. Объект cart содержит коллекцию товаров (iList). Вот код, который я использую для удаления куки: Код моей пустой корзины:

Dim currentCookie As HttpCookie = HttpContext.Current.Response.Cookies(cookieName)
currentCookie.Expires = DateTime.Now.AddYears(-30)
HttpContext.Current.Response.Cookies.Add(currentCookie)

Мой код LoadCartFromCookie:

if not HttpContext.Current.Request.Cookies(theCookieName) is nothing then
     _cart =  CType(HttpContext.Current.Request.Cookies(theCookieName).value,Cart)
End If

Мой конструктор класса корзины сначала пытается загрузить корзину из файла cookie. Если он находит cookie, он загружает объект корзины, в противном случае он создает новый экземпляр корзины без каких-либо подробностей. По какой-то причине, даже если я запускаю код удаления cookie (пустая корзина), а затем запускаю свой код LoadCartFromCookie (из класса Cart), он все равно загружает просроченный cookie. Какие-нибудь мысли? Я думал, что это может быть проблема с браузером, но я попробовал IE8, FF 3.5 и Chrome. Если внутри кодовой страницы и страницы ASPX я пытаюсь найти просроченный файл cookie (Request.Cookies (theName)), он никогда не найдет его. Именно это я и хочу сделать в классе.

Daniel

Ответы [ 3 ]

2 голосов
/ 14 февраля 2010

вы выполняете операторы вплотную или на следующем постбеке?

Вы просто загружаете cookie с истекшим сроком, потому что вы не удалили cookie, вы только что добавили cookie с истекшим сроком, нет?

Введите что-то вроде уловки 22, но на самом деле это запах кода ....

Чтобы удалить cookie в браузере, вам нужно отправить просроченный cookie . Но если вы используете cookie в качестве объекта данных в своем коде в том же цикле, вам придется управлять коллекцией cookie.

Либо посвятите один постбэк только удалению cookie, либо используйте объект clr, чтобы отслеживать вашу корзину, находясь в коде. например загрузить cookie в объект на page_load и установить cookie из объекта перед выходом, но не ссылаться на коллекцию Cookies.

p.s. Хотя я некоторое время не занимался использованием файлов cookie, если вы хотите заменить файл cookie, попробуйте Cookies.Remove () и добавьте новый, он должен заменить старый в браузере, сохраняя при этом один действительный файл cookie в коллекции. для тебя. Но я все еще не рекомендую использовать коллекцию файлов cookie для хранения данных в вашем коде за классами ...

2 голосов
/ 14 февраля 2010

По какой-то причине, даже если я запускаю код удаления cookie (пустая корзина), а затем запускаю свой код LoadCartFromCookie (из класса Cart), он все равно загружает просроченный cookie.

Мне кажется, что вы делаете это в том же запросе. Cookie удаляется в браузере клиента только после ответа от сервера с обновленным cookie с некоторой датой истечения. Поэтому обновите свой код в «LoadCartFromCookie», чтобы проверить и дату истечения срока действия.
И ИМО гораздо лучше хранить информацию о корзине в базе данных. Так что он будет доступен всем браузерам.

0 голосов
/ 14 февраля 2010

Чтобы истечь срок действия куки, попробуйте:

Dim cookie = HttpContext.Current.Request.Cookies(cookieName)
If Not cookie Is Nothing Then
    cookie.Expires = DateTime.Now.AddYears(-1)
    HttpContext.Current.Response.SetCookie(currentCookie)
End If
...