Вопрос

У меня есть следующий код, который устанавливает файл 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);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top