找不到 Request.GetOwinContext
Posted
技术标签:
【中文标题】找不到 Request.GetOwinContext【英文标题】:Can't find Request.GetOwinContext 【发布时间】:2014-05-01 04:05:00 【问题描述】:我一直在寻找一个小时试图弄清楚为什么这不起作用。
我有一个带有 WebAPI 的 ASP.Net MVC 5 应用程序。我正在尝试获取 Request.GetOwinContext().Authentication,但是我似乎找不到如何包含 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 也不给我任何智能感知选项。
我在这里错过了什么?
【问题讨论】:
它在System.Web.Http
命名空间中,但它来自System.Web.Http.Owin
dll。你参考过吗?
好的,我找到了 Microsoft.AspNet.WebApi.Owin 的 nuget 包并安装了它,并包含了 System.Web.Http 和 System.Web.Http.Owin 的使用,但它仍然不是不工作。
对不起,我上面的评论应该是System.Net.Http
命名空间。所以你不需要使用.Owin
,只需要你已经拥有的using System.Net.Http
。
ASP.Net Identity - HttpContext has no extension method for GetOwinContext 的可能重复项
【参考方案1】:
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 的管道非常不同,但通常具有相同的命名约定。因此,一种扩展方法不适用于另一种。许多动作过滤器等也是如此。
【讨论】:
第二个链接对我有用。只需在包管理器中运行 Install-Package Microsoft.AspNet.WebApi.Owin。 令牌撤销太难了!!!但是这个答案最终帮助我让它工作(加上从我可以访问的数据库中手动删除它)。谢谢!! 我也有这个问题,但是我使用 Install-Package Microsoft.Owin.Host.SystemWeb 来解决问题 我不明白为什么这被认为是正确的 - 这个扩展方法与 WebAPI 无关,实际上它在Microsoft.Owin.Host.SystemWeb
,而不是 Microsoft.AspNet.WebApi.Owin
。
@John - 如果您使用 API 控制器,您需要 Microsoft.AspNet.WebApi.Owin
。如果您在常规 MVC 控制器中,则需要Microsoft.Owin.Host.SystemWeb
。 Request
对象因您使用的控制器类型而异,因此扩展方法也不同。【参考方案2】:
这些都不适合我。我不得不将 Nuget 包与使用 Identity 创建的包进行比较,我发现这个 Nuget 包丢失了,添加后解决了我的问题
Microsoft.Owin.Host.SystemWeb
显然,您需要它使用 ASP.NET 请求管道在 IIS 上运行 OWIN(如果没有它,您就完蛋了!)
【讨论】:
您不必在 IIS 上运行。 @TrevordeKoekkoek 是的,但如果你正确阅读评论,它说你需要在 IIS 上运行该库(如果你想在 IIS 上运行,你不能没有这个库) 你需要那个包加上一个 using System.Web;声明。 它为我解决了这个问题。谢谢!【参考方案3】:在 WEB API 中,您可以使用以下方式获取参考:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
它适用于 Identity 2.0
【讨论】:
-1 这需要对 System.Web 的依赖,这在自托管场景中不可用。 这么久了,大家还在用HttpContext.Current吗?它是不可测试的。应该注入上下文。 仅安装 Nuget Package Microsoft.Owin.Host.SystemWeb 对我有用【参考方案4】:您可能需要添加 NuGet 包 Microsoft.Owin.Host.SystemWeb
才能执行此操作:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
【讨论】:
【参考方案5】:就我而言,我需要添加
using Microsoft.AspNet.Identity.Owin;
用于解析 GetOwinContext,然后在下一行解析 GetUserManager。
Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
【讨论】:
【参考方案6】:我有这个问题,我从 nuget 下载了额外的包来解决我的问题,(在包管理器控制台中运行以下命令) Install-Package Microsoft.Owin.Host.SystemWeb
【讨论】:
这也是我的解决方案 - Framework 4.6.2 Console App【参考方案7】:我花了很长时间才找到一个简单的答案:但我所做的是使用在启动时实例化的 IOwinContext 的单个实例的 Get 扩展。所以结果是这样的:
private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();
public ApplicationUserManager UserManager
get
return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
private set
_userManager = value;
【讨论】:
【参考方案8】:(请注意,此答案适用于 ASP.NET Web API,它对应于问题中使用的标签。如果您的询问与 ASP.NET MVC 相关,请参阅 this question。)
该问题未指定 ASP.NET Web API 服务将如何成为hosted。 this post 中的对话框表示(强调我的):
kichalla 写于 2014 年 10 月 24 日凌晨 1:35
如果您不是自托管,请不要使用 Microsoft.AspNet.WebApi.Owin 带有 IIS 的包...这个包只应该与 self 一起使用 托管。
在accepted answer 中推荐使用Microsoft.AspNet.WebApi.Owin
包。在这个答案中,我报告了在 IIS 中托管 ASP.NET Web API 服务时对我有用的方法。
首先,安装以下 NuGet 包:
Microsoft.Owin.Host.SystemWeb
OWIN 服务器使基于 OWIN 的应用程序能够在 IIS 上运行 ASP.NET 请求管道。
(请注意,在我撰写本文时,此 NuGet 包的最新可用版本是 3.1.0。此外,在可能重要的范围内,我使用的是 Visual Studio 2013 Update 5。)
安装此 NuGet 包后,您可以执行以下操作:
using Microsoft.Owin;
using System.Web;
IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();
现在,阐明如何解决这些陈述。在 Visual Studio 中,如果您在任一语句中右键单击 GetOwinContext
并选择“Peek Definition”,Visual Studio 将显示以下内容:
// Assembly Microsoft.Owin.Host.SystemWeb.dll, v3.1.0.0
using Microsoft.Owin;
using System;
using System.Runtime.CompilerServices;
namespace System.Web
public static class HttpContextExtensions
public static IOwinContext GetOwinContext(this HttpContext context);
public static IOwinContext GetOwinContext(this HttpRequest request);
如您所见,在System.Web
命名空间内,有两个 GetOwinContext
扩展方法:
HttpContext
类中的一个,并且
HttpRequest
类中的另一个。
再次,对于那些在 IIS 中托管其 Web API 服务的人,我希望这可以消除关于在 2017 年这个后期可以找到GetOwinContext
定义的任何歧义。
【讨论】:
【参考方案9】:在GUI线程以外的线程中找不到GetOwinContext()
扩展方法。
因此请注意不要从任何await
ed 函数中调用此函数。
【讨论】:
【参考方案10】:查看 ASP.NET 默认项目后,我发现我需要在我的应用程序启动中包含它:
// 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);`
【讨论】:
【参考方案11】:我缺少包:用于 ApiControllers 的 Microsoft.AspNet.WebApi.Owin。 希望这会有所帮助!
【讨论】:
【参考方案12】:我遇到了同样的问题并通过使用私有方法解决了它:
private IAuthenticationManager AuthenticationManager
get
return HttpContext.Current.GetOwinContext().Authentication;
这对我来说非常有效。
【讨论】:
【参考方案13】:我必须添加包Microsoft.AspNet.Identity.Owin
【讨论】:
以上是关于找不到 Request.GetOwinContext的主要内容,如果未能解决你的问题,请参考以下文章