Ich habe eine Stunde lang gesucht, um herauszufinden, warum dies nicht funktioniert.
Ich habe eine ASP.Net MVC 5-Anwendung mit einer WebAPI. Ich versuche, Request.GetOwinContext (). Authentication zu erhalten, aber ich kann anscheinend nicht finden, wie GetOwinContext eingeschlossen werden kann. Hier ist mein Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using TaskPro.Models;
namespace TaskPro.Controllers.api
{
public class AccountController : ApiController
{
[HttpPost]
[AllowAnonymous]
public ReturnStatus Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var ctx = Request.GetOwinContext(); // <-- Can't find this
return ReturnStatus.ReturnStatusSuccess();
}
return base.ReturnStatusErrorsFromModelState(ModelState);
}
}
}
Nach dem, was ich gelesen habe, sollte es Teil von System.Net.Http sein, aber ich habe das aufgenommen und es wird immer noch nicht aufgelöst. Strg-Leertaste gibt mir auch keine Intellisense-Optionen.
Was fehlt mir hier?
c#
asp.net-web-api
owin
Scottie
quelle
quelle
System.Web.Http
Namespace, aber es ist aus derSystem.Web.Http.Owin
DLL. Haben Sie darauf verwiesen?System.Net.Http
Namespace gelesen haben . Sie brauchen also keine Verwendung für.Owin
, nurusing System.Net.Http
die Sie bereits haben.Antworten:
Die
GetOwinContext
Erweiterungsmethode befindet sich in derSystem.Web.Http.Owin
DLL, die als Nuget-Paket heruntergeladen werden muss (Der Name des Nuget-Pakets lautet Microsoft.AspNet.WebApi.Owin).Siehe msdn hier: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx
Nuget-Paket hier: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin
Die Methode ist jedoch immer noch Teil des
System.Net.Http
Namespace, daher sollten dieusing
Definitionen, die Sie haben, in Ordnung sein.BEARBEITEN
Okay, um Verwirrung zu beseitigen: Wenn Sie einen ApiController (dh
MyController : ApiController
) verwenden, benötigen Sie dasMicrosoft.AspNet.WebApi.Owin
Paket.Wenn Sie einen normalen Mvc-Controller (dh
MyController : Controller
) verwenden, benötigen Sie dasMicrosoft.Owin.Host.SystemWeb
Paket.In MVC 5 waren die Pipelines für Api und reguläres MVC sehr unterschiedlich, haben jedoch häufig die gleichen Namenskonventionen. Eine Erweiterungsmethode in der einen gilt also nicht für die andere. Gleiches gilt für viele Aktionsfilter usw.
quelle
Microsoft.Owin.Host.SystemWeb
, nichtMicrosoft.AspNet.WebApi.Owin
.Microsoft.AspNet.WebApi.Owin
. Wenn Sie sich in einem normalen MVC-Controller befinden, benötigen SieMicrosoft.Owin.Host.SystemWeb
. DasRequest
Objekt unterscheidet sich je nachdem, welchen Controllertyp Sie verwenden, also eine andere Erweiterungsmethode.Nichts davon hat bei mir funktioniert. Ich musste Nuget-Pakete mit einem vergleichen, das mit Identity erstellt wurde, und fand, dass dieses Nuget-Paket fehlte, wodurch das Problem beim Hinzufügen behoben wurde
Anscheinend benötigen Sie es, um OWIN unter IIS mithilfe der ASP.NET-Anforderungspipeline auszuführen (lesen Sie, dass Sie ohne es geschraubt sind!).
quelle
In der WEB-API können Sie die Referenz wie folgt abrufen:
es funktioniert in Identity 2.0
quelle
Möglicherweise müssen Sie dazu das NuGet-Paket hinzufügen
Microsoft.Owin.Host.SystemWeb
:quelle
In meinem Fall muss ich hinzufügen
zum Auflösen von GetOwinContext und dann von GetUserManager in der folgenden Zeile.
quelle
Ich habe dieses Problem und lade ein zusätzliches Paket von Nuget herunter, um mein Problem zu lösen (führen Sie den folgenden Befehl in der Package Manager-Konsole aus). Install-Package Microsoft.Owin.Host.SystemWeb
quelle
Ich habe ewig gebraucht, um eine einfache Antwort zu finden: Ich habe jedoch die Get-Erweiterung der einzelnen Instanz des IOwinContext verwendet, die beim Start instanziiert wurde. So kam es heraus:
quelle
Das
GetOwinContext()
Erweiterungsmethode wird nicht in anderen Threads als dem GUI-Thread gefunden.Achten Sie also darauf, diese Funktion nicht innerhalb einer
await
ed-Funktion aufzurufen .quelle
Nachdem ich mir das ASP.NET-Standardprojekt angesehen hatte, stellte ich fest, dass ich dies in meinen Anwendungsstart einbeziehen musste:
quelle
Mir fehlte das Paket: Microsoft.AspNet.WebApi.Owin für ApiController. Hoffe das hilft!
quelle
Ich hatte das gleiche Problem und löste es mit einer privaten Methode:
private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }
Das hat bei mir gut funktioniert.
quelle
(Bitte beachten Sie, dass diese Antwort für die ASP.NET-Web-API gilt, die dem für die Frage verwendeten Tag entspricht. Siehe diese Frage wenn sich Ihre Anfrage auf ASP.NET MVC bezieht.)
Die Frage gibt nicht an, wie der ASP.NET-Web-API-Dienst gehostet werden soll . Der Dialog in diesem Beitrag zeigt an (Hervorhebung von mir):
Die Verwendung des
Microsoft.AspNet.WebApi.Owin
Pakets wird in der akzeptierten Antwort empfohlen . In dieser Antwort berichte ich, was beim Hosten eines ASP.NET-Web-API-Dienstes in IIS für mich funktioniert hat .Installieren Sie zunächst das folgende NuGet-Paket:
(Beachten Sie, dass beim Schreiben die neueste verfügbare Version dieses NuGet-Pakets 3.1.0 ist . Soweit dies von Bedeutung ist, verwende ich Visual Studio 2013 Update 5.)
Nach der Installation dieses NuGet-Pakets können Sie Folgendes tun:
Um nun etwas Licht ins Dunkel zu bringen, wie diese Aussagen gelöst werden. Wenn Sie in Visual Studio mit der rechten Maustaste
GetOwinContext
auf eine der Anweisungen klicken und "Peek Definition" auswählen, zeigt Visual Studio Folgendes an:Wie Sie sehen können
System.Web
, gibt es im Namespace zweiGetOwinContext
Erweiterungsmethoden:HttpContext
Klasse undHttpRequest
Klasse.Ich hoffe erneut, dass diejenigen, die ihren Web-API-Dienst in IIS hosten, Unklarheiten darüber beseitigen, wo eine Definition für
GetOwinContext
dieses späte Datum im Jahr 2017 zu finden ist.quelle
Ich musste Paket hinzufügen
Microsoft.AspNet.Identity.Owin
quelle