Проверьте, существует ли 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 по имени?
Ответы
Ответ 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