找不到 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.SystemWebRequest 对象因您使用的控制器类型而异,因此扩展方法也不同。【参考方案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()扩展方法。

因此请注意不要从任何awaited 函数中调用此函数。

【讨论】:

【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

java 枚举 找不到符号

bat系统找不到指定文件怎么办?

java package找不到符号

SpringBoot报找不到 dao 问题

ubuntu20.04找不到start命令

找不到名为“my”的模块。找不到名为“mycontroller”的控制器