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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置HttpContext.Current.User会抛出null引用异常相关的知识,希望对你有一定的参考价值。

这是WCF单向操作。在这些操作中清除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)

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

答案

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

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

另一答案

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

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

另一答案

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

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

NotificationContext是内部的,在我写的时候只有OnRequestNotificationCompletionHelper没有设置。

异常情况似乎如下:

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

这看起来像一个框架bug :(

另一答案

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

要么

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

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

为了找出造成这个问题的原因,我建议你设置一个断点到引发异常的行,并检查该行的任何部分是否指向null

防撞替代方案可能是:

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

以上是关于设置HttpContext.Current.User会抛出null引用异常的主要内容,如果未能解决你的问题,请参考以下文章

在剃刀中获取当前用户名

时钟设置在哪里设置?

QGIS基本设置和项目设置

短视频运营短视频剪辑 ⑤ ( 视频素材使用 | 设置插入后的视频素材属性 | 设置画面 | 设置音频 | 设置变速 | 设置动画 | 设置调节 )

SeeMusicMIDI 编辑功能 ( 速度设置 | SoundFont 音源设置 | 混响强度设置 | 混响时间设置 | 力度增益设置 | 实时 MIDI 设置 )

win10设置里的代理怎么设置