HttpContext.User является нулевым в методе BeginExecute для несуществующих статических файлов - PullRequest
0 голосов
/ 11 июня 2018

Этот заголовок испорчен, но я смотрел на него в течение 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 вызывается в первую очередь, когда контроллер no вообще обрабатывает запрос?Я уверен, что не существует контроллера, производного от 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 - вызовы BeginExecute, User равны нулю, ответ 500.

То, что я собрал:

  1. Кажется, что это происходит только при наличии расширения файла - ., за которым следуют любые символы
  2. Это кажется только при/files/.Нет FilesController, только каталог Files, содержащий статические файлы.Также нет ни области, ни пользовательского сопоставления маршрута с /files/*, что могло бы объяснить вызов BaseAuthorizedController.

Есть идеи относительно того, что может вызвать такое поведение?

1 Ответ

0 голосов
/ 19 июня 2018

Оказывается, это смесь IIS и маршрутизация проблема:

  1. Маршрутизация - в моем проекте фактически есть FillesController,однако он зарегистрирован в отдельной области , поэтому он не должен соответствовать этому маршруту.Однако это было и было причиной исключения нулевой ссылки.
  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-подобный синтаксис в качестве кода, поэтому я использовал встроенный формат.

Если у кого-нибудь есть хорошее объяснение, я с радостью приму их ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...