设置HttpContext.Current.User会引发空引用异常

4

这是一个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个回答

1
您无法设置它的原因很可能是请求已经完成。设置用户属性会导致ASP.NET尝试回调到每个请求的数据结构,如果这些数据结构已被释放,则结果行为未定义。
对于单向操作,WCF在同时告诉ASP.NET不要等待应用程序代码完成并立即完成请求时调用应用程序代码。因此强烈建议您不要从单向操作中访问HttpContext。

我怀疑这是情况。与此同时,我会等待看看是否有其他相关的评论。 - taminov
我也遇到了同样的问题。不过,在我的情况下,该方法是从SignalR Hub中调用的。有什么解决办法吗? - Umair M
@UmairM 你解决了吗?我在SignalR Hub(AuthorizeAttribute)中遇到了同样的问题,谢谢。 - Guilherme Waltricke
我不得不改变我的实现方式来解决这个问题,所以最终我放弃了这个调用,因为我的大部分代码都是“架构不良的”。 - Umair M

0

很明显,引发异常的行中某个对象为空。

检查您是否有当前的HttpContext,我怀疑HttpContext.Current为空。


你确定HttpContext.Current不是null吗? - Petr
是的,我确定。在调试器中,我可以看到“null”在用户上,而在当前上则有一个实例。 - taminov

0

调用堆栈显示执行了HttpContext的实例方法。

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

NotificationContext是内部的,并且仅由OnRequestNotificationCompletionHelper设置为未设置。

异常场景似乎看起来像:

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

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


-1

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

或者

您传递的用户(之前保存的)实际上指向null。从堆栈跟踪中可以看出,这很可能是原因,因为异常是由System.Web.HttpContext.set_User(IPrincipal value)引发的。

User实际上不是一个变量,而是一个属性。将其更改为另一个值会调用一个函数,在新用户值为null的情况下抛出此异常。

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

防崩溃的替代方法可能是:

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

当前的 current 和之前保存过的 userThatWasSavedBefore 是有效的实例,我可以在调试器中看到用户名和其他成员。 - taminov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接