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