繁体   English   中英

设置HttpContext.Current.User引发null引用异常

[英]setting HttpContext.Current.User throws null reference exception

这是WCF单向操作。 在这些操作中清除了HttpContext.Current.User,这就是我添加一个在清除之前保存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。

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

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

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

异常情况看起来像:

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

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

之所以出现此问题,是因为这些类中的某些对象为空(例如HttpContext.Current)。

要么

您正在传递的用户(您之前保存过的用户)实际上指向null 从堆栈跟踪中可以看到,很可能是这种情况,因为System.Web.HttpContext.set_User(IPrincipal value)引发了异常

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

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

防撞替代方案可能是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM