Нулевая проверка файлов cookie HttpResponse ASP.NET

У меня есть нулевой код проверки, который проверяет, существует ли файл cookie в объекте ответа:

         if (HttpContext.Current.Response.Cookies["CookieName"] != null)
        {
            sessionCookie = HttpContext.Current.Response.Cookies["CookieName"];
            cookieValue = sessionCookie.Value;
        }

Когда я проверяю через отладчик, ключ не существует до проверки, но он существует после проверки. Таким образом, возвращаемое значение из файла cookie равно нулю. Проверяет ли наличие файлов cookie автоматически, создается ли файл cookie?

заранее спасибо


person Martini48    schedule 13.02.2012    source источник


Ответы (3)


Это происходит потому, что HttpContext.Current связан с потоком, в котором в данный момент выполняется запрос. В другом потоке фреймворк не может узнать, какой запрос вы хотите использовать.

Есть способы исправить это — например, BackgroundWorker .NET может распространять контекст в другой поток. Поддержка асинхронных страниц в ASP.NET также будет правильно распространять контекст.

Таким образом, у вас есть два варианта: либо переписать весь свой асинхронный код, чтобы использовать асинхронные механизмы передачи контекста, такие как BackgroundWorker или Async Pages, либо изменить свой код, чтобы он проверял наличие HttpContext.Current==null перед попыткой доступа к каким-либо свойствам HttpContext.Current.

person MethodMan    schedule 13.02.2012
comment
Имеет смысл, я думаю, тогда мне нужно будет проверить нулевое значение. - person Martini48; 13.02.2012
comment
Звучит хорошо.. дайте нам знать, как у вас получится.. gald, я мог бы протянуть вам руку помощи... - person MethodMan; 13.02.2012
comment
Я также хотел бы убедиться, что там, где вы ожидаете увидеть/назначить файл cookie [CookieName], например, вы пытаетесь его назначить. смысл...? - person MethodMan; 13.02.2012
comment
Не знаю, почему это принятый ответ. Кажется, это имеет очень мало общего с вопросом. Ответ положительный, любой вызов Response.Cookies[CookieName] фактически создает файл cookie. - person Doug S; 06.12.2012

Тот случай, когда первый ответ содержит ерунду, не относящуюся к вопросу.

Каждый раз, когда вы делаете проверку:

if (HttpContext.Current.Response.Cookies["CookieName"] != null)

эта строка кода не только проверяет, существует ли файл cookie, но и создает новый пустой файл cookie. Даже метод Get создает[1] новый файл cookie неявно.

Вы можете использовать такой код:

Cookie existing_cookie = null;
foreach (Cookie c in HttpContext.Current.Response.Cookies)
{
    if ("CookieName" == c.Name)
    {
        existing_cookie = c;
        break;
    }
}
if (null != existing_cookie)
{
    // exists
}

Или используйте LINQ методы, чтобы сделать почти то же самое.

person maxkoryukov    schedule 28.08.2015

Ответ да, любой вызов Response.Cookies["CookieName"] фактически создает файл cookie.

person Doug S    schedule 06.12.2012