Подтвердить что ты не робот

Проверьте, существует ли Cookie

Из быстрого поиска в Qaru я увидел людей, предлагающих следующий способ проверки наличия файла cookie:

HttpContext.Current.Response.Cookies["cookie_name"] != null

или (внутри класса Page):

this.Response.Cookies["cookie_name"] != null

Однако, когда я пытаюсь использовать indexer (или метод Cookies.Get) для извлечения куки файла, который не существует, он, по-видимому, фактически создает cookie 'default' с этим именем и возвращает что, независимо от того, какое имя cookie я использую, он никогда не возвращает null. (и еще хуже - создает нежелательный файл cookie)

Я делаю что-то неправильно здесь, или есть другой способ просто проверить наличие определенного файла cookie по имени?

4b9b3361

Ответ 1

Response.Cookies содержит файлы cookie, которые будут отправлены обратно в браузер. Если вы хотите узнать, существует ли файл cookie, вероятно, вы должны изучить Request.Cookies.

В любом случае, чтобы увидеть, существует ли файл cookie, вы можете проверить Cookies.Get(string). Однако, если вы используете этот метод для объекта Response, и файл cookie не существует, то этот файл cookie будет создан.

См. ссылку MSDN для HttpCookieCollection.Get Метод (строка)

Ответ 2

Иногда вам все равно нужно знать, существует ли файл cookie в Response. Затем вы можете проверить, существует ли файл cookie:

HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")

Более подробную информацию можно найти здесь.

В моем случае мне пришлось изменить Response Cookie в методе Application_EndRequest в Global.asax. Если Cookie не существует, я не трогаю его:

string name = "myCookie";
HttpContext context = ((HttpApplication)sender).Context;
HttpCookie cookie = null;

if (context.Response.Cookies.AllKeys.Contains(name))
{
    cookie = context.Response.Cookies[name];
}

if (cookie != null)
{
    // update response cookie
}

Ответ 3

Вам нужно использовать HttpContext.Current.Request.Cookies, а не Response.Cookies.

Боковое примечание: файлы cookie копируются в Request на Response.Cookies.Add, что делает проверку того, что любой из них будет вести себя одинаково для новых добавленных файлов cookie. Но входящие файлы cookie никогда не отражаются в Response.

Это поведение описано в HttpResponse.Cookies:

После добавления файла cookie с помощью коллекции HttpResponse.Cookies, cookie будет немедленно доступен в коллекции HttpRequest.Cookies, даже если ответ не был отправлен клиенту.

Ответ 4

Здесь есть много правильных ответов в зависимости от того, что вы пытаетесь выполнить; здесь моя попытка дать исчерпывающий ответ:

Оба объекта Request и Response содержат свойства Cookies, которые являются объектами HttpCookieCollection.

Request.Cookies:

  • Эта коллекция содержит файлы cookie, полученные от клиента
  • Эта коллекция доступна только для чтения
  • Если вы попытаетесь получить доступ к несуществующему файлу cookie из этой коллекции, вы получите значение null.

Response.Cookies:

  • Этот сборник содержит только файлы cookie, добавленные сервером во время текущего запроса.
  • Эта коллекция доступна для записи
  • Если вы попытаетесь получить доступ к несуществующему файлу cookie из этой коллекции, вы получите новый объект cookie; Если в коллекции Request.Cookies существует файл cookie, к которому вы пытались получить доступ НЕ НЕ, он будет добавлен (но если объект Request.Cookies уже содержит файл cookie с тем же ключом, и даже если он значение устарело, оно не будет обновляться, чтобы отражать изменения от вновь созданного файла cookie в коллекции Response.Cookies.

Решения


Если вы хотите проверить наличие cookie от клиента, выполните одно из следующих действий

  • Request.Cookies["COOKIE_KEY"] != null
  • Request.Cookies.Get("COOKIE_KEY") != null
  • Request.Cookies.AllKeys.Contains("COOKIE_KEY")

Если вы хотите проверить наличие файла cookie, который был добавлен сервером во время текущего запроса, выполните следующие действия:

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY") (см. здесь)

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

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null (см. здесь)

... приведет к созданию файла cookie в коллекции Response.Cookies, и состояние будет оцениваться с помощью true.

Ответ 5

public static class CookieHelper
{
    /// <summary>
    /// Checks whether a cookie exists.
    /// </summary>
    /// <param name="cookieCollection">A CookieCollection, such as Response.Cookies.</param>
    /// <param name="name">The cookie name to delete.</param>
    /// <returns>A bool indicating whether a cookie exists.</returns>
    public static bool Exists(this HttpCookieCollection cookieCollection, string name)
    {
        if (cookieCollection == null)
        {
            throw new ArgumentNullException("cookieCollection");
        }

        return cookieCollection[name] != null;
    }
}

Использование:

Request.Cookies.Exists("MyCookie")

Ответ 6

Извините, недостаточно комментариев, чтобы добавить комментарий, но из ответа zmbq:

В любом случае, чтобы увидеть, существует ли файл cookie, вы можете проверить Cookies.Get(string), это не изменит коллекцию файлов cookie.

может быть не совсем корректно, так как Cookies.Get(string) фактически создаст файл cookie с этим именем, если он еще не существует. Однако, по его словам, вам нужно искать Request.Cookies, а не Response.Cookies Итак, что-то вроде:

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;

Ответ 7

Вы можете сделать что-то подобное, чтобы узнать значение cookie:

Request.Cookies[SESSION_COOKIE_NAME].Value