Нулева проверка на ASP.NET HttpResponse Cookies

Имам нулев код за проверка, който проверява дали вече съществува бисквитка в обекта за отговор:

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

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

Благодаря предварително


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
звучи добре.. уведомете ни как се оказва за вас.. честито, бих могъл да ви помогна... - person MethodMan; 13.02.2012
comment
Бих се уверил също така, че където очаквате да видите/присвоите бисквитката [CookieName] например, че се опитвате да я присвоите .. нещо като ако трябва да присвоите Session[MySession] = някаква променлива.. прави ли това смисъл...? - person MethodMan; 13.02.2012
comment
Нямам представа защо това е приетият отговор. Изглежда, че има много малко общо с въпроса. Отговорът е да, извикването на Response.Cookies[CookieName] по какъвто и да е начин всъщност създава бисквитката. - person Doug S; 06.12.2012

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

Всеки път, когато правите проверката:

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

този ред от код не само проверява дали съществува бисквитка, но и създава нова празна бисквитка. Дори методът Get създава[1] новата бисквитка имплицитно.

Можете да използвате кода по следния начин:

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"] по какъвто и да е начин всъщност създава бисквитката.

person Doug S    schedule 06.12.2012