Проверьте, существует ли 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