0

我有一个空检查代码,它正在检查响应对象中是否已经存在 cookie:

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

当我通过调试器检查时,密钥在检查之前不存在,但在检查之后确实存在。因此 cookie 的返回值为 null。检查 cookie 是否存在会自动创建 cookie?

提前致谢

4

3 回答 3

1

答案是肯定的,以任何方式调用Response.Cookies["CookieName"]实际上都会创建 cookie。

于 2012-12-06T05:31:05.253 回答
1

这种情况下,当第一个答案包含与问题无关的废话时。

每次检查时:

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

这行代码不仅会检查 cookie 是否存在,还会创建一个新的空 cookie。EvenGet方法隐式地创建[ 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方法做几乎相同的事情。

于 2015-08-28T05:45:13.073 回答
-1

发生这种情况是因为 HttpContext.Current 与当前正在执行请求的线程相关联。在不同的线程上,框架无法知道您要使用哪个请求。

有一些方法可以解决这个问题——例如,.NET 的 BackgroundWorker 可以将上下文传播到另一个线程。ASP.NET 中的异步页面支持也将正确传播上下文。

因此,您有两个选择:要么重写所有异步代码以使用诸如 BackgroundWorker 或 Async Pages 之类的上下文传递异步机制,要么在尝试访问 HttpContext.Current 的任何属性之前更改代码以检查 HttpContext.Current==null

于 2012-02-13T19:33:26.350 回答