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

问题描述 投票:1回答:4

这是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)

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

c# .net wcf asp.net-4.5
4个回答
1
投票

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

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


0
投票

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

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


0
投票

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

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

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

异常情况似乎如下:

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

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


-1
投票

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

要么

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

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

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

防撞替代方案可能是:

if (HttpContext.Current != null && userThatWasSavedBefore != null)
{
    HttpContext.Current.User = (RolePrincipal)userThatWasSavedBefore;
}
© www.soinside.com 2019 - 2024. All rights reserved.