Файл cookie теряет ценность в ASP.net
Вопрос
У меня есть следующий код, который устанавливает файл cookie:
string locale = ((DropDownList)this.LoginUser.FindControl("locale")).SelectedValue;
HttpCookie cookie = new HttpCookie("localization",locale);
cookie.Expires= DateTime.Now.AddYears(1);
Response.Cookies.Set(cookie);
Однако когда я пытаюсь прочитать файл cookie, значение равно нулю.Файл cookie существует.Я никогда не пройду мимо следующего, если проверю:
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
Помощь?
Решение
Проверка делается после ответа на пост?В этом случае вам следует вместо этого прочитать файл cookie из коллекции Request.
Файлы cookie сохраняются в браузере путем добавления их в Response.Cookies и считываются из Request.Cookies.
Файлы cookie, добавленные в Response, можно прочитать, только если страница находится по тому же запросу.
Другие советы
Наиболее вероятный ответ можно увидеть на эта почта
Когда вы пытаетесь проверить наличие файла cookie с помощью объекта Response, а не Request, ASP.net автоматически создает файл cookie.
Редактировать: В качестве примечания: в итоге я написал программное обеспечение, которое должно было проверять наличие файлов cookie, которые ASP.NET превращает в кошмар из-за своего API файлов cookie.В итоге я написал процесс преобразования, который извлекает файлы cookie из запроса и создает объект моего состояния.В конце запроса я затем перевожу свой объект состояния обратно в файлы cookie и помещаю их в ответ (при необходимости).Это облегчило попытки выяснить, есть ли в ответе файлы cookie, и вместо этого обновить их, избегая создания бессмысленных файлов cookie и т. д.
Вам надоела коллекция «Запрос» вместо коллекции «Ответ»?
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
Думаю, я знаю ответ.
Просто УДАЛИТЬ атрибут действия в вашем <form>
ярлык.
сделать так: <form id="form1" runat="server">
вместо этого: <form id="form1" action="DisplayName.aspx" runat="server">
Затем вам следует использовать Response.Redirect("DisplayName.aspx");
в вашем коде.
если вы компилируете в режиме отладки, включите трассировку соответствующих страниц и убедитесь, что файл cookie находится в коллекции запросов.Задайте трассировку в директиве @page в файле aspx.
Попробуйте этот фрагмент -
string locale = ((DropDownList)this.LoginUser.FindControl("locale"))
.SelectedValue;
HttpCookie myCookie = new HttpCookie("localization");
Response.Cookies.Add(myCookie);
myCookie.Values.Add("locale", locale);
Response.Cookies["localization"].Expires = DateTime.Now.AddYears(1);
И прочитать это -
if (Request.Cookies["localization"] != null)
{
HttpCookie cookie = Request.Cookies["localization"];
string locale = cookie.Values["locale"].ToString();
}
У меня была аналогичная проблема: я не мог прочитать файлы cookie при обратной передаче.Проблема для меня заключалась в том, что я установил для свойства Secure файла cookie значение true.Говорят, что когда свойство Secure файла cookie включено, это приводит к передаче файла cookie только в том случае, если соединение использует уровень защищенных сокетов.Однако я не уверен, как мне удалось увидеть файл cookie в браузере в первый раз, но не при обратной передаче, учитывая, что я не передал через SSL.В любом случае, переключение cookie.Secure на false решило проблему и позволило считывать файлы cookie при обратной передаче.
Извините, если это не имеет никакого отношения к вашей проблеме, я хотел поделиться этим, потому что потратил некоторое время на поиски решения этой проблемы.
Я бы добавил это как комментарий к ответу Криса Маришича, но у меня нет такой привилегии :-(
В дополнение к тому, что Крис сказал в своем редактировании об удалении файлов cookie из запроса, чтобы иметь возможность прочитать значение вновь созданных файлов cookie в обратной передаче, которую я в конечном итоге сделал
Private Sub SetPageSize(ByVal pageSize As Integer)
' Set cookie value to pageSize
Dim pageSizeCookie As HttpCookie = New HttpCookie(pageSizeCookieName)
With pageSizeCookie
.Expires = Now.AddYears(100)
.Value = pageSize.ToString
End With
' Add to response to save it
Me.Response.Cookies.Add(pageSizeCookie)
' Add to request so available for postback
Me.Request.Cookies.Remove(pageSizeCookieName)
Me.Request.Cookies.Add(pageSizeCookie)
End Sub
Строки Request.Cookies.Remove и Request.Cookies.Add позволяют работать с обратными передачами.
используйте Response.Cookies.Add(cookie);вместо Response.Cookies.Set(cookie);