Этот заголовок испорчен, но я смотрел на него в течение 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
, который обрабатывает этот запрос.
Более того, это происходит только тогда, когда в запрашивается несуществующий файл .файлы каталог.
Для пояснения с некоторыми примерами:
localhost:1000/non-existing-file.txt
- возвращает 404
. localhost:1000/files/existing-file.txt
- возвращает содержимоефайл в виде простого текста. localhost:1000/files/not-existing-file
- возвращает 404
. localhost:1000/files/not-existing-file.txt
- вызовы BeginExecute
, User
равны нулю, ответ 500
.
То, что я собрал:
- Кажется, что это происходит только при наличии расширения файла -
.
, за которым следуют любые символы - Это кажется только при
/files/
.Нет FilesController
, только каталог Files
, содержащий статические файлы.Также нет ни области, ни пользовательского сопоставления маршрута с /files/*
, что могло бы объяснить вызов BaseAuthorizedController
.
Есть идеи относительно того, что может вызвать такое поведение?