Szukałem przez godzinę, próbując dowiedzieć się, dlaczego to nie działa.
Mam aplikację ASP.Net MVC 5 z interfejsem WebAPI. Próbuję uzyskać Request.GetOwinContext (). Uwierzytelnianie, jednak nie mogę znaleźć sposobu uwzględnienia GetOwinContext. Oto mój kod:
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);
}
}
}
Z tego, co przeczytałem, powinien być częścią System.Net.Http, ale włączyłem to i nadal nie jest rozwiązany. Ctrl-Space również nie daje mi żadnych opcji Intellisense.
Czego tu brakuje?
c#
asp.net-web-api
owin
Scottie
źródło
źródło
System.Web.Http
przestrzeni nazw, ale pochodzi zSystem.Web.Http.Owin
biblioteki dll. Czy wspomniałeś o tym?System.Net.Http
przestrzeń nazw. Więc nie potrzebujesz użycia.Owin
, po prostuusing System.Net.Http
już masz.Odpowiedzi:
Metoda
GetOwinContext
rozszerzenia znajduje się wSystem.Web.Http.Owin
bibliotece dll, którą należy pobrać jako pakiet nuget (nazwa pakietu nuget to Microsoft.AspNet.WebApi.Owin)Zobacz msdn tutaj: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx
Pakiet Nuget tutaj: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin
Jednak metoda jest nadal częścią
System.Net.Http
przestrzeni nazw, więcusing
definicje, które masz, powinny być w porządku.EDYTOWAĆ
OK, aby wyjaśnić pewne nieporozumienia: jeśli używasz ApiController (tj.
MyController : ApiController
), Będziesz potrzebowaćMicrosoft.AspNet.WebApi.Owin
pakietu.Jeśli używasz zwykłego kontrolera MVC (tj.
MyController : Controller
), Będziesz potrzebowaćMicrosoft.Owin.Host.SystemWeb
pakietu.W MVC 5 potoki dla Api i zwykłego MVC były bardzo różne, ale często mają te same konwencje nazewnictwa. Zatem metoda rozszerzenia w jednej nie ma zastosowania do drugiej. To samo dotyczy wielu filtrów akcji itp.
źródło
Microsoft.Owin.Host.SystemWeb
, nieMicrosoft.AspNet.WebApi.Owin
.Microsoft.AspNet.WebApi.Owin
. Jeśli używasz zwykłego kontrolera MVC, będziesz potrzebowaćMicrosoft.Owin.Host.SystemWeb
.Request
Obiekt różni się w zależności od typu regulatora używasz więc inną metodę rozszerzenia.Żaden z nich nie działał dla mnie. Musiałem porównać pakiety Nuget z pakietem utworzonym za pomocą Identity i stwierdziłem, że brakuje tego pakietu Nuget, który po dodaniu rozwiązał problem
Najwyraźniej potrzebujesz go do uruchamiania OWIN w usługach IIS przy użyciu potoku żądań ASP.NET (przeczytaj, że masz spieprzone bez tego!)
źródło
W WEB API możesz uzyskać odniesienie, korzystając z:
działa w Identity 2.0
źródło
Microsoft.Owin.Host.SystemWeb
Aby to zrobić, może być konieczne dodanie pakietu NuGet :źródło
W moim przypadku muszę dodać
do rozwiązywania GetOwinContext, a następnie GetUserManager w następnym wierszu.
źródło
Mam ten problem i pobieram dodatkowy pakiet z nuget, aby rozwiązać mój problem, (uruchom następujące polecenie w konsoli Menedżera pakietów) Install-Package Microsoft.Owin.Host.SystemWeb
źródło
Znalezienie prostej odpowiedzi zajęło mi wieczność: ale to, co zrobiłem, to użycie rozszerzenia Get pojedynczego wystąpienia IOwinContext, którego wystąpienie zostało utworzone podczas uruchamiania. Więc wyszło tak:
źródło
(Należy pamiętać, że ta odpowiedź dotyczy interfejsu API sieci Web ASP.NET, który odpowiada tagowi użytemu w pytaniu. Zobacz to pytanie, jeśli Twoje zapytanie dotyczy ASP.NET MVC.)
Pytanie nie określa sposobu hostowania usługi ASP.NET Web API . Okno dialogowe w tym poście wskazuje (wyróżnienie moje):
Microsoft.AspNet.WebApi.Owin
W zaakceptowanej odpowiedzi zaleca się użycie pakietu . W tej odpowiedzi zgłaszam, co zadziałało podczas hostowania usługi ASP.NET Web API w IIS .Najpierw zainstaluj następujący pakiet NuGet:
(Pamiętaj, że w trakcie pisania najnowszą dostępną wersją tego pakietu NuGet jest 3.1.0 . Ponadto, w zakresie, w jakim może to mieć znaczenie, używam Visual Studio 2013 Update 5).
Po zainstalowaniu tego pakietu NuGet możesz wykonać następujące czynności:
Teraz, aby rzucić trochę światła na to, jak rozwiązuje się te stwierdzenia. W programie Visual Studio, jeśli klikniesz prawym przyciskiem myszy
GetOwinContext
dowolną instrukcję i wybierzesz „Peek Definition”, program Visual Studio wyświetli następujące informacje:Jak widać, w
System.Web
przestrzeni nazw istnieją dwieGetOwinContext
metody rozszerzające:HttpContext
klasie iHttpRequest
klasie.Ponownie, dla tych, którzy hostują swoją usługę interfejsu API sieci Web w usługach IIS, mam nadzieję, że wyjaśni to wszelkie niejasności dotyczące tego, gdzie
GetOwinContext
można znaleźć definicję w odniesieniu do późnej daty w 2017 r.źródło
Metoda
GetOwinContext()
rozszerzenia nie została znaleziona w wątkach innych niż wątek GUI.Dlatego uważaj, aby nie wywołać tej funkcji z poziomu żadnej
await
funkcji ed.źródło
Po przejrzeniu domyślnego projektu ASP.NET odkryłem, że muszę uwzględnić to podczas uruchamiania mojej aplikacji:
źródło
Brakowało mi pakietu: Microsoft.AspNet.WebApi.Owin dla ApiControllers. Mam nadzieję że to pomoże!
źródło
Miałem ten sam problem i rozwiązałem go metodą prywatną:
private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }
U mnie to zadziałało.
źródło
Musiałem dodać pakiet
Microsoft.AspNet.Identity.Owin
źródło