Unterschied zwischen HttpContext.Current und Controller.Context in MVC ASP.NET

72

Ich arbeite an einer MVC ASP .NET-Anwendung. Ich bin für beide relativ neu.

In einem Controller versuche ich, den aktuellen angemeldeten Benutzer abzurufen, für den es zwei Möglichkeiten zu geben scheint:

System.Web.HttpContext.Current.User.Identity.Name

Oder

HttpContext.User.Identity.Name

Was ist der Unterschied zwischen diesen? Soweit ich innerhalb des MVC-Frameworks feststellen kann, hat der Controller den aktuellen HttpContext als Eigenschaft gespeichert, sodass diese Methoden identisch sind. Ist das korrekt?

Ton
quelle

Antworten:

91

Ja, sie sind normalerweise identisch. Wenn Sie jedoch mit zusätzlichen Threads arbeiten, ist dies nicht der Fall. System.Web.HttpContext.Currentist threadstatisch.

Lucero
quelle
38
Nur um Ihre ansonsten hervorragende Antwort zu verdeutlichen: ThreadStatic bedeutet, dass der Wert an den Thread gebunden ist. Das heißt, in keinem zusätzlichen Thread können Sie nicht auf HttpContext.Current zugreifen.
Tamas Czinege
6
Vergessen Sie auch nicht, dass sich auf dem Controller auch ein ControllerContext befindet, der MVC-spezifische Informationen wie die RouteData-Auflistung enthält.
James Avery
25

Der vom Controller bereitgestellte Kontext (nicht der statische HttpContext.Current) ist verspottbar. Wenn Sie daran interessiert sind, Ihren Code zu testen, ist es im Allgemeinen viel einfacher, einen nachgebildeten ControllerContext zu erstellen und auf dem Controller festzulegen, als HttpContext.Current zu durchlaufen. Andernfalls verweist ControllerContext.HttpContext auf dieselben Daten wie HttpContext.Current.

Levi
quelle