找不到Request.GetOwinContext

我一直在寻找一个小时,试图找出为什么这不起作用。

我有一个WebAPI ASP.Net MVC 5应用程序。 我试图得到Request.GetOwinContext()。身份validation,但是我似乎无法find如何包含GetOwinContext。 这是我的代码:

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); } } } 

从我读过的,它应该是System.Net.Http的一部分,但是我已经包含了它,它仍然没有解决。 Ctrl-Space也不给我任何intellisense选项。

我在这里错过了什么?

GetOwinContext扩展方法在System.Web.Http.Owin dll中, 需要作为nuget包下载 (nuget包的名称是Microsoft.AspNet.WebApi.Owin)

 Install-Package Microsoft.AspNet.WebApi.Owin 

请参阅msdn这里: http : //msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext( v = vs.118) .aspx

Nuget包在这里: https ://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

但是,该方法仍然是System.Net.Http命名空间的一部分,所以using定义应该没问题。

编辑

好的,清除一些混淆:如果您使用ApiController(即MyController : ApiController ),您将需要Microsoft.AspNet.WebApi.Owin包。

如果您使用的是常规Mvc控制器(即MyController : Controller ),则需要使用Microsoft.Owin.Host.SystemWeb软件包。

在MVC 5中,API和常规MVC的stream水线非常不同,但是通常具有相同的命名约定。 所以一个扩展方法不适用于另一个。 相同的很多行动filter等

这些都没有为我工作。 我不得不比较Nuget包与创build一个身份,我发现这个Nuget包丢失,当添加解决这个问题给我

 Microsoft.Owin.Host.SystemWeb 

显然,你需要它使用ASP.NET请求pipe道在IIS上运行OWIN(阅读你没有它的拧!)

在WEB API中,您可以使用以下方法获取参考:

 HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

它在Identity 2.0中起作用

您可能需要添加NuGet包Microsoft.Owin.Host.SystemWeb才能这样做:

 HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

这使我永远find一个简单的答案:但我所做的是使用在启动中实例化的IOwinContext的单个实例的Get扩展。 所以就这样出来了:

 private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext(); public ApplicationUserManager UserManager { get { return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ; } private set { _userManager = value; } } 

我有这个问题,我从nuget下载额外的软件包来解决我的问题,(在包pipe理器控制台中运行以下命令) 安装程序包Microsoft.Owin.Host.SystemWeb

在我的情况下,我需要添加

 using Microsoft.AspNet.Identity.Owin; 

解决GetOwinContext然后GetUserManager在下面的行。

 Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

在GUI线程以外的线程中找不到GetOwinContext()扩展方法。

所以要小心不要在任何await函数中调用这个函数。

在看了ASP.NET默认项目之后,我发现我需要在应用程序启动时join这个项目:

 // Enable the application to use a cookie to store information for the signed in user // and to use a cookie to temporarily store information about a user logging in // with a third party login provider app.UseCookieAuthentication(new CookieAuthenticationOptions()); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);` 

我遗失了包:ApiControllers的Microsoft.AspNet.WebApi.Owin。 希望这可以帮助!

我有这个相同的问题,并通过使用私有方法解决它: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } } private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

这对我来说很有效。