C# HttpContext Cookie

C# HttpContext Cookie,c#,asp.net,C#,Asp.net,这个代码有什么问题吗?每隔一段时间,我们的生产网站就会在第4行出现一个空引用异常。我无法在测试中重现此情况。您确定在第4行而不是第一行看到异常吗?您的代码看起来很好,但有一个异常:HttpContext。当前的有时为null,这会导致您的第一行代码出现异常 最常见的情况是,在后台线程中运行的代码与执行请求的线程不同。例如,如果您自己创建一个线程,或者如果您在传入BeginXXX异步方法调用的回调中执行代码,您将得到一个nullHttpContext.Current 发生这种情况的原因是HttpC

这个代码有什么问题吗?每隔一段时间,我们的生产网站就会在第4行出现一个空引用异常。我无法在测试中重现此情况。

您确定在第4行而不是第一行看到异常吗?您的代码看起来很好,但有一个异常:
HttpContext。当前的
有时为
null
,这会导致您的第一行代码出现异常

最常见的情况是,在后台线程中运行的代码与执行请求的线程不同。例如,如果您自己创建一个线程,或者如果您在传入BeginXXX异步方法调用的回调中执行代码,您将得到一个null
HttpContext.Current

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

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


因此,您有两种选择:要么重写所有异步代码以使用上下文传递异步机制,如
BackgroundWorker
或异步页面,要么更改代码以检查
HttpContext.Current==null
,然后再尝试访问
HttpContext.Current的任何属性,抛出异常的是第4行。
if (HttpContext.Current.Request.Cookies.AllKeys.Contains("myCookie") &&
    !String.IsNullOrEmpty(HttpContext.Current.Request.Cookies["myCookie"].Value))
{
    HttpCookie myCookie = HttpContext.Current.Request.Cookies["myCookie"];
}