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)

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

4

4 回答 4

1

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

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

于 2013-04-21T21:56:31.460 回答
0

显然,抛出异常的行中的某些对象为空。

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

于 2013-04-21T16:30:08.510 回答
0

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

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

NotificationContext是内部的,并且仅在我编写时由OnRequestNotificationCompletionHelper取消设置。

异常情况看起来像:

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

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

于 2018-03-05T03:04:00.927 回答
-1

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

或者

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

用户实际上不是一个变量,而是一个属性。将其更改为另一个值是调用一个函数,如果用户的新值为null.

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

防撞替代方案可能是:

if (HttpContext.Current != null && userThatWasSavedBefore != null)
{
    HttpContext.Current.User = (RolePrincipal)userThatWasSavedBefore;
}
于 2013-04-21T18:01:28.307 回答