控制器在迁移到 ASP.NET 核心 1 后不工作

Controller not working after migrating to ASP.NET Core 1

我正在将我的 ASP.NET 4 应用程序迁移到 ASP.NET Core。我的 API 中的大多数方法都可以正常工作,但奇怪的是有些方法不能,而且我也看不出任何原因。

我正在使用 Owin.OAuth 身份验证 (OAuthAuthorizationServerProvider),并且除了两个调用外,所有调用都填充了 this.User(来自 ControllerBase)属性正确。仅对于两个控制器,这不起作用!

所以这个控制器可以工作,更具体地说,在构建时 this.User 是 none 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为null

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

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

请注意,this.UserMicrosoft.AspNetCore.Mvc.ControllerBase 上的 属性,AuthenticatedController 继承自该 Microsoft.AspNetCore.Mvc.ControllerBase

你不能从构造函数访问User,因为它依赖于ControllerContext 属性,它在构造函数被初始化后由ASP.NET Core MVC初始化已调用。

理想情况下,考虑重构您的代码,这样它就不会尝试从构造函数访问 User 等依赖于请求的属性。

如果你真的不能重构它,考虑导入IHttpContextAccessor作为构造函数依赖:

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