找不到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; } }
这对我来说很有效。