2016-11-28 16 views
2

Im мигрировал мое приложение ASP.NET 4 в ядро ​​ASP.NET. Большинство методов в моем API работают нормально, но странно некоторые не делают, и я не вижу причин.Контроллер не работает после перехода на ASP.NET Core 1

Я использую аутентификацию Owin.OAuth (OAuthAuthorizationServerProvider) и для всех, кроме двух вызовов, свойство this.User (from ControllerBase) заполнено правильно. Для двух контроллеров это не работает!

Так что этот контроллер работает, точнее, в точке построения this.User не имеет значения null и содержит правильного пользователя для маркера Bearer.

[Authorize] 
public class DriversController : AuthenticatedController 
{ 
    public DriversController() : base() 
    { 
     // this.User is none null! 
    } 

    [HttpGet] 
    [Route("api/drivers")] 
    public async Task<IActionResult> GetDrivers() 
    { 
     ... 
    } 
} 

Этот контроллер не работает, когда конструктор попал, this.User является нулевым

[Authorize] 
public class DriversAssignmentController : AuthenticatedController 
{ 
    public DriversAssignmentController() : base() 
    { 
     // this.User is null! 
    } 

    [HttpGet] 
    [Route("api/driverassignment")] 
    public async Task<IActionResult> GetDriversAssignments() 
    { 
     ... 
    } 
} 

Обратите внимание, что this.User является собственностью на Microsoft.AspNetCore.Mvc.ControllerBase которые AuthenticatedController наследуется от.

+0

Вы перепутали атрибут Route с HttpGet атрибут? – benjrb

+0

Я изначально украсил его '[HttpGet]' и '[Route (" api/... ")]', и это не сработало. Я видел несколько примеров, которые просто использовали 'HttpGet', так что я решил попробовать. Это не имело значения :) – Chris

ответ

4

Вы не можете получить доступ к User от конструктора, поскольку он полагается на свойство ControllerContext, которое инициализируется ASP.NET Core MVC после вызова конструктора.

В идеале рассмотрите вопрос о реорганизации кода, чтобы он не пытался получить доступ к зависимым от запроса свойствам, например User от конструктора.

Если вы действительно не реорганизовать его, считают импортирования IHttpContextAccessor как конструктор зависимости:

public DriversController(IHttpContextAccessor accessor) 
{ 
    var user = accessor.HttpContext.User; 
} 
+0

Так вот почему он не работает в конструкторе, а делает в методах! Спасибо за это. Я использовал его в конструкторе, поэтому мне не пришлось повторять код для создания моего уровня DataService при каждом вызове. – Chris

Смежные вопросы