Cookie теряет ценность в ASP.net - PullRequest
       12

Cookie теряет ценность в ASP.net

14 голосов
/ 16 октября 2008

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

Помощь

Ответы [ 9 ]

46 голосов
/ 16 октября 2008

Проверка производится после поста обратно? Если это так, вы должны вместо этого прочитать cookie из коллекции Request.

Файлы cookie сохраняются в браузере путем добавления их в Response.Cookies и считываются из Request.Cookies.

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

19 голосов
/ 12 октября 2010

Наиболее вероятный ответ виден на этом посте

Когда вы пытаетесь проверить наличие файла cookie, используя объект Response, а не Reqest, ASP.net автоматически создает файл cookie.

Редактировать: В качестве примечания я в итоге написал программное обеспечение, необходимое для проверки существования файлов cookie, которые ASP.NET превращает в кошмар из-за их API cookie. Я закончил тем, что написал процесс преобразования, который берет куки из запроса и создает мой объект состояния. В конце запроса я затем перевожу свой объект состояния обратно в файлы cookie и вставляю их в ответ (при необходимости). Это облегчало попытки выяснить, есть ли в ответе файлы cookie, вместо этого обновлять их, избегая создания ненужных файлов cookie и т. Д.

1 голос
/ 27 сентября 2011

Мне кажется, я знаю ответ.

Просто УДАЛИТЕ атрибут действия в вашем теге <form>.

сделать так: <form id="form1" runat="server">

вместо этого: <form id="form1" action="DisplayName.aspx" runat="server">

Затем вы должны использовать Response.Redirect("DisplayName.aspx"); в своем коде.

1 голос
/ 16 октября 2008

Вы устали от коллекции «Запрос» вместо коллекции «Ответ»?

if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
0 голосов
/ 21 марта 2013

Добавил бы это в качестве комментария к ответу Криса Марисика, но у меня нет такой привилегии: - (

В дополнение к тому, что сказал Крис в своем редакторе об удалении файлов 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, которые заставляют его работать на обратных передачах

0 голосов
/ 07 октября 2010

У меня была похожая проблема, я не мог читать куки при обратной передаче. Для меня проблема заключалась в том, что я установил для свойства cookie cookie значение true. Говорят, что когда свойство Secure cookie включено, оно вызывает передачу cookie только в том случае, если соединение использует уровень защищенных сокетов. Однако я не уверен, как мне удалось увидеть cookie в браузере в первый раз, но не при обратной передаче, учитывая, что я не передавал по SSL. В любом случае, превратив cookie в значение false, решил проблему, и файлы cookie были прочитаны при обратной передаче.

Извините, если это не имеет ничего общего с вашей проблемой, я хотел бы поделиться этим, потому что я потратил некоторое время на поиски решения этой проблемы.

0 голосов
/ 16 октября 2008

, если вы компилируете в режиме отладки, включите трассировку для рассматриваемых страниц и убедитесь, что cookie находится в коллекции запросов. Установите трассировку в директиве @page в файле aspx.

0 голосов
/ 16 октября 2008

Попробуйте этот фрагмент -

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();
}
0 голосов
/ 16 октября 2008

использовать Response.Cookies.Add (cookie); вместо Response.Cookies.Set (cookie);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...