设置HttpContext.Current.User会抛出null引用异常

时间:2013-04-21 16:24:23

标签: c# .net wcf asp.net-4.5

这是WCF Oneway操作。在这些操作中清除HttpContext.Current.User,这就是我添加一个在清除用户之前保存用户的行为的原因。后来我想用我保存的值重新设置HttpContext.Current.User,但是我得到了一个异常:

HttpContext.Current.User = (RolePrincipal)userThatWasSavedBefore;

Object reference not set to an instance of an object.
at System.Web.HttpContext.SetPrincipalNoDemand(IPrincipal principal, Boolean needToSetNativePrincipal)
at System.Web.HttpContext.set_User(IPrincipal value)
at (My Function)

为什么我不能设置用户?有什么问题?

4 个答案:

答案 0 :(得分:1)

您无法设置它的原因很可能是请求已完成。设置User属性会导致ASP.NET尝试回调每个请求的数据结构,如果这些数据结构已经释放,那么结果行为是未定义的。

对于单向操作,WCF调用应用程序代码,同时告诉ASP.NET不要等待应用程序代码完成并立即完成请求。因此强烈建议您不要从单向操作访问HttpContext。

答案 1 :(得分:0)

显然,抛出异常的行中的某个对象为null。

检查你是否有一个当前的HttpContext,也就是说,我怀疑HttpContext.Current是否为空。

答案 2 :(得分:0)

调用堆栈显示已执行instance method of HttpContext

换句话说 - HttpContext在那里,异常是由其他东西引起的 - 缺少NulRef检查可能是_notificationContext。

NotificationContext是内置的,在我写的时候仅由OnRequestNotificationCompletionHelper取消设置。

异常情况似乎如下:

  • 有些工作要做异步 - 不阻止/阻止请求完成
  • 请求处理已完成
  • 您的工作项为已完成的请求设置HttpContext.User

这看起来像一个框架错误:(

答案 3 :(得分:-1)

这个问题是因为这些类中的某些对象为null(例如HttpContext.Current)

OR

您在那里经过的用户(以及之前保存的用户)实际上是指向null。正如您从堆栈跟踪中看到的那样,很有可能出现这种情况,因为System.Web.HttpContext.set_User(IPrincipal value)抛出了异常

用户实际上不是变量,而是属性。并将其更改为另一个值是调用一个函数,如果用户的新值为null,则抛出此异常。

为了找出导致此问题的原因,我建议您设置一个断点到抛出异常的行,并检查该行的任何部分是否指向null

崩溃证明替代方案可以是:

if (HttpContext.Current != null && userThatWasSavedBefore != null)
{
    HttpContext.Current.User = (RolePrincipal)userThatWasSavedBefore;
}