2016-11-28 6 views
2

Im Migrieren meiner ASP.NET 4 App zu ASP.NET Core. Die meisten Methoden in meiner API funktionieren gut, aber seltsamerweise manche nicht und ich kann keinen Grund dafür sehen.Controller funktioniert nicht nach der Migration auf ASP.NET Core 1

Ich benutze Owin.OAuth Authentifizierung (OAuthAuthorizationServerProvider) und für alle außer zwei Anrufe, die this.User (von ControllerBase) Eigenschaft ist korrekt ausgefüllt. Bei zwei Controllern funktioniert das nur nicht!

So funktioniert dieser Controller, genauer gesagt an der Stelle der Konstruktion this.User ist keine null und enthält den richtigen Benutzer für ihre Bearer-Token.

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

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

Dieser Controller funktioniert nicht, wenn der Konstruktor getroffen wird, ist this.User null

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

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

Beachten Sie, dass this.User ist eine Eigenschaft auf Microsoft.AspNetCore.Mvc.ControllerBase welche AuthenticatedController erbt von.

+0

Haben Sie vertauscht die Strecke Attribut mit dem Attribut HttpGet? – benjrb

+0

Zuerst habe ich es mit '[HttpGet]' und '[Route (" api/... ")]' dekoriert und es hat nicht funktioniert. Ich habe ein paar Beispiele gesehen, die 'HttpGet' verwendet haben, also dachte ich, ich würde es versuchen ... es machte keinen Unterschied :) – Chris

Antwort

4

Sie können nicht über den Konstruktor auf User zugreifen, da es auf der ControllerContext -Eigenschaft beruht, die von ASP.NET Core MVC nach dem Aufruf des Konstruktors initialisiert wird.

Im Idealfall sollten Sie Ihren Code refaktorisieren, damit er nicht vom Konstruktor aus auf anforderungsabhängige Eigenschaften wie User zugreifen kann.

Wenn Sie wirklich nicht es Refactoring, betrachten IHttpContextAccessor als Konstrukteur Abhängigkeit importieren:

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

Das wäre also der Grund, warum es nicht im Konstruktor funktioniert, sondern in den Methoden !! Danke dafür. Ich habe es im Konstruktor verwendet, sodass ich nicht Code wiederholen musste, um meine DataService-Schicht bei jedem Aufruf zu erstellen. – Chris

Verwandte Themen