[英]HttpContext.Current.User is null when IsOneWay = true
[英]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.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.