对于不存在的静态文件,HttpContext.User在BeginExecute方法中为null

时间:2018-06-11 18:52:22

标签: asp.net-mvc routing

这个标题搞砸了,但我盯着它看了10分钟,我真的不知道如何更好地说出来。

我正在使用.NET 4.6

BaseAuthorizedController[Authorize]覆盖方法修饰的抽象BeginExecute抛出异常。

代码行如下所示:

var userId = requestContext.HttpContext.User.Identity.GetUserId();

请求是关于一个不再存在的静态文件。稍后会详细介绍。

例外是:Object reference not set to an instance of an object.,堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
   <namespace>.BaseAuthorizedController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) in <path>\Controllers\BaseAuthorizedController.cs:35
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +16
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__4(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) +52
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +369
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +159

HttpContext.User对象为空。这是有道理的,因为它是一个简单的静态文件请求。我不明白为什么首先调用BeginExecute方法,当没有控制器处理请求时?我确信没有控制器,它来自BaseAuthorizedController,它处理这个请求。

此外,只有在文件目录下请求不存在的文件时才会发生这种情况。

通过一些例子澄清:

  1. localhost:1000/non-existing-file.txt - 返回404
  2. localhost:1000/files/existing-file.txt - 以纯文本形式返回文件内容。
  3. localhost:1000/files/not-existing-file - 返回404
  4. localhost:1000/files/not-existing-file.txt - 来电BeginExecuteUser为空,回复为500
  5. 我收集的内容:

    1. 只有当文件扩展名存在时才会出现 - .后跟任何符号
    2. 似乎只在/files/下发生。没有FilesController,只有Files目录,包含静态文件。没有区域或自定义路线映射到/files/*,这可以解释对BaseAuthorizedController的调用。
    3. 有什么可能导致这种行为的想法吗?

1 个答案:

答案 0 :(得分:0)

事实证明,这是 IIS 路由问题的组合:

  1. 路由-在我的项目中实际上有一个FillesController,但是它是在单独的 Area 中注册的,因此不应与该路由匹配。但是确实如此,这导致了空引用异常。
  2. IIS-我通过在runAllManagedaModulesForAllRequests="true"-Web.config中添加modules来解决此问题。这是现在的样子:

    <modules runAllManagedModulesForAllRequests="true"> <remove name="FormsAuthenticationModule" /> <remove name="UrlRoutingModule-4.0" /> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"/> <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler"/> <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" /> <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler"/> <add name="ClearServerError" type="Suls.Web.Common.HttpModules.ClearServerErrorModule" /> </modules>

我不明白为什么可以解决此问题,因为据我所知MS docs格式,此设置仅覆盖preCondition

由于某种原因,我无法将这种类似xml的语法作为代码发布,所以我使用了内联格式。

如果有人能很好地解释我,我很乐意接受他们的回答