【问题标题】:setting HttpContext.Current.User throws null reference exception设置 HttpContext.Current.User 抛出空引用异常
【发布时间】:2013-04-21 16:24:23
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我怀疑是这种情况。同时我会等着看是否还有其他相关的cmets。
    • 我面临同样的问题。但是,就我而言,该方法是从 SignalR Hub 调用的。任何想法如何解决这个问题?
    • @UmairM 你解决了吗?我在 SignalR 集线器(AuthorizeAttribute)中遇到了同样的问题,谢谢
    • 我不得不改变我的实现来解决这个问题,所以我最终完全放弃了调用,因为我的大部分代码都是“糟糕的架构”
    【解决方案2】:

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

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

    【讨论】:

    • 你确定 HttpContext.Current 不为空吗?
    • 是的,我确定。我可以在调试器中的 User 上看到“null”,在 Current 上看到一个实例。
    【解决方案3】:

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

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

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

    异常情况看起来像:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      防撞替代方案可能是:

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

      【讨论】:

      • Current 和 userThatWasSavedBefore 都是有效实例,我可以在调试器中看到用户名和其他成员..
      猜你喜欢
      • 1970-01-01
      • 2021-04-29
      • 2022-01-05
      • 1970-01-01
      • 2011-07-22
      • 2014-11-19
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多