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

от быстрого поиска на Переполнение Стека Я видел людей, предлагающих следующий способ проверить, существует ли cookie:

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

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

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

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

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

7 ответов


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

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

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


иногда вам все равно нужно знать, существует ли Cookie в ответ. Затем вы можете проверить, существует ли ключ cookie:

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

больше информации можно найти здесь.

в моем случае мне пришлось изменить файл Cookie ответа в методе Application_EndRequest в Global.асакс. Если 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
}

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

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

это поведение задокументировано в HttpResponse.Печенье свойства:

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


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

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

Request.Cookies:

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

Response.Cookies:

  • эта коллекция содержит только файлы cookie, добавленные сервером во время текущего запроса.
  • эта коллекция доступна для записи
  • если вы попытаетесь получить доступ к несуществующему cookie из этой коллекции, вы получите новый объект cookie; если cookie, который вы пытались получить доступ тут Не на Request.Cookies коллекция, она будет добавлена (но если 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.


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

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

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

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

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

вы можете сделать что-то вроде этого, чтобы узнать значение cookies:

Request.Cookies[SESSION_COOKIE_NAME].Value