在使用授权属性时发生了NullReferenceException异常

8

我在HomeController上使用了[Authorize]属性,每次尝试访问它时,都会抛出NullReferenceException

这真的很奇怪,因为我以前多次使用[Authorize],而且它运行得很好。唯一不同的是,这个应用程序是托管在我们自己的Web服务器上,使用Windows 7和IIS 7.5。

以下是堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +38
System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +160
System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +155
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +784976
System.Web.Mvc.Controller.ExecuteCore() +159
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335 System.Web.Mvc.<>c_DisplayClassb.b_5() +62
System.Web.Mvc.Async.<>c_DisplayClass1.b_0() +20
System.Web.Mvc.<>c_DisplayClasse.b_d() +54
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371

编辑:

在查看AuthorizeCore方法的代码时,似乎AuthorizeCore抛出NullReferenceException是因为它获取了一个NULL的HttpContextBase

这可能吗?因为应用程序中的其他所有内容都运行良好,如访问数据库、创建授权cookie等。

编辑2:

只有在将其发布到Web服务器后才会发生这种情况。在开发过程中,从Visual Studio中运行完全正常。


我因为一个无效的cookie而遇到了这个异常。如果你也遇到了这个问题,尝试打开浏览器中的开发者工具,进入“资源”选项卡或类似选项,并删除与该网站相关的所有cookie。当你重新加载页面时,它可能会正常工作。 :-) - Patrick
3个回答

4
问题变得更加严重,因为在控制器和Razor视图中甚至没有可用的HttpContext。所以,我使用“aspnet_regiis -ir”重新安装了ASP.NET v4.0。然后使用注册期间创建的“ASP.NET 4.0”池,而不是使用“DefaultAppPool”。这样就开始正常工作了,并解决了我在应用程序web.config中覆盖“<modules runAllManagedModulesForAllRequests="true"/>”的另一个问题。

1
在我的情况下,我在一个global.asax应用程序事件中将HttpContext.Current.User设置为null。当我让User属性保持不变时,错误消失了。

我也在做同样的事情。谢谢。 - Carter Medlin

0

你可能需要确保你的站点所使用的应用程序池具有托管管道模式=经典。


是的,我正在使用DefaultAppPool,它是.NET 4、集成管线,并且使用LocalSystem身份(访问SQL Server)。 - Charandeep Singh
看起来问题是httpContext为空。尝试使用Classic .NET AppPool。请参阅http://msdn.microsoft.com/en-us/library/bb515251.aspx#CLASSIC获取更多详细信息。 - Strillo
转换为Classic App Pool后,由于其MVC,它显示DirectoryListingModule已禁用错误。 - Charandeep Singh
你是怎么解决这个问题的?!我也遇到了同样的问题?!真的很奇怪! - Tim
@Charandeep:我之前也遇到了你同样的问题,但最后解决了。对我起作用的是在 web.config 中加入了这一行:<modules runAllManagedModulesForAllRequests="true"> 请参考我的帖子http://stackoverflow.com/questions/7167251/mock-presence-of-authorize-attribute。 - Tim
是的,我也有<modules runAllManagedModulesForAllRequests="true" />,但是在applicationHost.config中使用<location>,因为我无法在我的应用程序web.config中覆盖它。我也尝试了这个解决方案,但对我没有用。然后我看到了这篇文章https://dev59.com/XHE95IYBdhLWcg3wSb_P并重新安装了ASP.NET(这次我从**Framework64**目录安装,因为它是一个64位机器),然后它开始工作了。 - Charandeep Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接