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

问题描述:

Im将我的ASP.NET 4应用程序迁移到ASP.NET Core。我的API中的大多数方法都可以正常工作,但奇怪的是有些方法不行,我不明白为什么。控制器在迁移到ASP.NET Core后不工作1

我正在使用Owin.OAuth身份验证(OAuthAuthorizationServerProvider),除了两个调用之外,所有this.User(从ControllerBase)属性都已正确填充。对于两个控制器只有这个不行!

所以这个控制器的工作,更具体地在建设这个点。用户不是空的,并包含其持票人令牌的正确用户。

[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.ControllerBaseAuthenticatedController继承财产。

+0

你混淆了路由属性与属性HTTPGET? – benjrb

+0

我最初用'[HttpGet]'和'[Route(“api/...”)]'来装饰它,它不起作用。我看到一些只使用'HttpGet'的例子,所以我想试试它..它没有区别:) – Chris

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

理想情况下,考虑重构您的代码,以免它从构造函数访问请求相关的属性,如User

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

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

所以这就是为什么它不在构造函数中工作,但在方法中!谢谢你。我在构造函数中使用它,所以我不必在每次调用时重复代码来创建我的DataService层。 – Chris