这是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)
为什么我不能设置用户?有什么问题?
答案 0 :(得分:1)
您无法设置它的原因很可能是请求已完成。设置User属性会导致ASP.NET尝试回调每个请求的数据结构,如果这些数据结构已经释放,那么结果行为是未定义的。
对于单向操作,WCF调用应用程序代码,同时告诉ASP.NET不要等待应用程序代码完成并立即完成请求。因此强烈建议您不要从单向操作访问HttpContext。
答案 1 :(得分:0)
显然,抛出异常的行中的某个对象为null。
检查你是否有一个当前的HttpContext,也就是说,我怀疑HttpContext.Current是否为空。
答案 2 :(得分:0)
调用堆栈显示已执行instance method of HttpContext。
换句话说 - HttpContext在那里,异常是由其他东西引起的 - 缺少NulRef检查可能是_notificationContext。
NotificationContext是内置的,在我写的时候仅由OnRequestNotificationCompletionHelper取消设置。
异常情况似乎如下:
这看起来像一个框架错误:(
答案 3 :(得分:-1)
这个问题是因为这些类中的某些对象为null(例如HttpContext.Current)
OR
您在那里经过的用户(以及之前保存的用户)实际上是指向null
。正如您从堆栈跟踪中看到的那样,很有可能出现这种情况,因为System.Web.HttpContext.set_User(IPrincipal value)
抛出了异常
用户实际上不是变量,而是属性。并将其更改为另一个值是调用一个函数,如果用户的新值为null
,则抛出此异常。
为了找出导致此问题的原因,我建议您设置一个断点到抛出异常的行,并检查该行的任何部分是否指向null
崩溃证明替代方案可以是:
if (HttpContext.Current != null && userThatWasSavedBefore != null)
{
HttpContext.Current.User = (RolePrincipal)userThatWasSavedBefore;
}