2013-04-21 113 views
1

这是一个WCF Oneway操作。 HttpContext.Current.User在这些操作中被清除,这就是我添加了一个行为来保存清除之前的用户的原因。后来我想重新设置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) 

为什么我不能设置用户?问题是什么?

回答

1

您无法设置它的原因很可能是请求已完成。设置User属性会导致ASP.NET试图回调每个请求的数据结构,并且如果这些数据结构已经发布,那么结果的行为是未定义的。

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

+0

我怀疑这是同时我会等待看看是否还有其他相关评论。 – taminov 2013-04-21 22:24:42

0

显然,抛出异常的行中的某个对象为null。

检查您是否有当前的HttpContext,也就是说,我怀疑HttpContext.Current为null。

+0

没有,只在HttpContext.Current.User用户是空的。 – taminov 2013-04-21 16:34:18

+0

你确定HttpContext.Current不为空? – Petr 2013-04-21 17:58:06

+0

是,我可以在调试器中看到“null”和Current上的实例。 – taminov 2013-04-21 22:10:59

-1

这个问题可能是因为在这些类中的某些对象为空(如HttpContext.Current)

OR

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

引发的,用户实际上不是变量,而是属性。并且将其更改为另一个值将调用一个函数,该函数在用户的新值为null时抛出此异常。

为了找出是什么原因造成这个问题,我建议你设置一个断点行被抛出异常,并检查该行的任何部分没有指向null

防崩溃,替代可能是:

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

Current和userThatWasSavedBefore是有效的实例,我可以在调试器中看到用户名和其他成员。 – taminov 2013-04-21 22:21:49

0

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

换句话说 - HttpContext在那里,异常被别的东西激发 - 缺少可能用于_notificationContext的NulRef检查。

NotificationContext是内部的,我只写OnRequestNotificationCompletionHelper

例外情况似乎是这样的:

  • 有些工作要异步完成的 - 没有被完成
  • 请求处理完成
  • 你的工人项目设置的HttpContext块/阻止的请求。用户对成品要求

这看起来像一个框架的bug :(