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, значение равно Null. Файл cookie существует. Я никогда не пропустил следующее, если проверит:
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
Справка
Ответы
Ответ 1
Проверка выполняется после сообщения назад? Если это так, вы должны прочитать cookie из коллекции Request.
Файлы cookie сохраняются в браузере, добавляя их в Response.Cookies и считываются с Request.Cookies.
Файлы cookie, добавленные в Response, могут быть прочитаны, только если страница находится на одном запросе.
Ответ 2
Наиболее вероятный ответ на этот пост
Когда вы пытаетесь проверить наличие cookie с использованием объекта Response, а не Reqest, ASP.net автоматически создает cookie.
Изменить: В качестве примечания я в конечном итоге написал программное обеспечение, необходимое для проверки наличия файлов cookie, которые ASP.NET делает из кошмара из-за их API cookie. Я закончил писать процесс преобразования, который принимает файлы cookie из запроса и делает мой объект состояния. В конце запроса я затем перевежу свой объект состояния обратно в файлы cookie и добавлю их в ответ (при необходимости). Это облегчает попытку выяснить, есть ли файлы cookie в ответе, вместо этого обновить их, избегая создания бессмысленных файлов cookie и т.д.
Ответ 3
Думаю, я знаю ответ.
Просто удалите атрибут действия в тэге <form>
.
сделайте так: <form id="form1" runat="server">
вместо этого: <form id="form1" action="DisplayName.aspx" runat="server">
Затем вы должны использовать Response.Redirect("DisplayName.aspx");
в своем коде.
Ответ 4
У вас есть устаревшая коллекция "Запрос" вместо коллекции "Ответ"?
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
Ответ 5
Попробуйте этот фрагмент -
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();
}
Ответ 6
если вы компилируете в режиме отладки, включите трассировку для рассматриваемых страниц и убедитесь, что файл cookie находится в коллекции запросов. Установите трассировку в директиве @page в файле aspx.
Ответ 7
У меня была аналогичная проблема, я не мог читать куки на обратной передаче. Проблема для меня в том, что я проверил свойство Secure cookie на true. Говорят, что когда свойство Secure cookie включено, это приводит к передаче файла cookie только в том случае, если соединение использует Secure Sockets Layer. Однако я не уверен, как я впервые увидел куки файл в браузере, но не на обратной передаче, учитывая, что я не передавал через SSL. Во всяком случае, превращение cookie.Secure в false, решил проблему, и куки были прочитаны после обратной передачи.
Извините, если это не нужно делать с вашей проблемой, я хотел бы поделиться этим, потому что я потратил некоторое время на то, как решить эту проблему.
Ответ 8
Добавил бы это как комментарий к Крису Марисскому, но у меня нет этого правила: - (
В дополнение к тому, что Крис сказал в своем правлении об удалении файлов cookie из запроса, чтобы иметь возможность читать вновь созданное значение cookie в postback, я закончил работу
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, которые заставляют его работать с postbacks
Ответ 9
используйте Response.Cookies.Add(cookie); вместо Response.Cookies.Set(cookie);