2011-02-08 50 views
3
if (HttpContext.Current.Request.Cookies.AllKeys.Contains("myCookie") && 
    !String.IsNullOrEmpty(HttpContext.Current.Request.Cookies["myCookie"].Value)) 
{ 
    HttpCookie myCookie = HttpContext.Current.Request.Cookies["myCookie"]; 
} 

这段代码有什么问题吗?每过一段时间,我们的制作网站都会在第4行收到一个空引用异常。我无法在测试中重现这一点。HttpContext Cookie

回答

9

您确定您在第4行看到异常,而不是第一行吗?你的代码看起来很好,只有一个例外:HttpContext.Current有时候是null,这会导致你的第一行代码出现异常。

最常见的情况下,您会看到这是当您在后台线程中运行代码,而后台线程与执行请求的线程不同时。例如,如果您自己创建线程,或者如果您在传递给BeginXXX异步方法调用的回调中执行代码,则会得到空值HttpContext.Current

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

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

所以,你有两个选择:要么重写你的所有异步代码中使用的上下文传递异步机制,例如BackgroundWorker或异步页,或更改你的代码试图访问的HttpContext.Current任何属性之前检查HttpContext.Current==null

+0

是的,它是第4行抛出异常。 – harmony 2011-02-08 20:30:53