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);