【问题标题】:'System.Web.HttpContext' does not contain a definition for 'GetOwinContext' Mystery“System.Web.HttpContext”不包含“GetOwinContext”之谜的定义
【发布时间】:2015-10-31 09:23:36
【问题描述】:

我意识到这个问题对某些人来说可能看起来微不足道,但正是这些类型的事情让我发现自己经常与之抗争,我只是想弄清楚这一切,尽管在 .net 中这似乎是一场失败的战斗(反正对我来说)。

所以,如果我执行以下操作:

    using System.Web;
...
ApplicationUser user = System.Web.HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());

这会在标题中产生错误和红色GetOwinContext() 以及错误无法解析符号'GetOwinContext()'

但是,如果我执行以下操作(从 HttpContext 前面删除 System.Web),它会按预期工作(或至少没有错误):

using System.Web;
    ...
    ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());

但是,如果我这样做(与 using System.Web 一起使用的同一行注释掉了):

    //using System.Web;
            ...
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());

它产生相同的红色GetOwinContext() 和错误无法解析符号'GetOwinContext()'

如果我googleHttpContext我只能发现它源于System.Web

那么,问题是为什么我不能使用上面第一个示例中的完整语法? (这里的答案中也提到了最高票数:ASP.NET MVC 5 - Identity. How to get current ApplicationUser

更新(解决重复的问题回复):虽然该问题的答案可能得出相同的结论,但我真的不明白这是一个重复的问题。尝试从新手的角度来思考它,并剖析 .Net 的所有烟雾和镜子。在我的生活中,我从来没有尝试过学习像 .Net 这样复杂的东西,有时你必须从许多不同的角度来看待事物。

我实际上看到了这个问题和另一个关于使用Current, 的问题,但两者都没有让我觉得 1) 是我(当时)正在寻找的答案 2) 更重要的是,为什么它会这样。山姆的回答是完美的,虽然有点过头了。但是,至少现在,我可以去研究这一切意味着什么……

【问题讨论】:

  • 据我所见,控制器有自己的 HttpContext Controller.HttpContext 并且有一个 System.Web.HttpContext Controller.HttpContext 有 GetOwinContext() .. 两者都有会话,但想想他们是一样的:)
  • 我将此归咎于naming conventions,我个人从不喜欢将属性命名为与类型相同的属性。如果不清楚,第三个问题也源于缺少扩展名(请参阅上面的@NightOwl888 链接)

标签: asp.net asp.net-mvc visual-studio


【解决方案1】:

当你写 System.Web.HttpContext 实际上你指向一个类。但是,当您在控制器内部编写HttpContext 时,您使用的是名为HttpContext 的属性,该属性返回HttpContext 类的对象。您还可以通过调用System.Web.HttpContext.Current 静态属性来访问相同的对象。因此你可以写:

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

【讨论】:

  • 我在这个 SO 问题 (here) 中看到了 Current。不幸的是,昨晚我的电脑崩溃后,我失去了撤消操作,但我想我试图把它放在GetOwinContext() 之后,就像一个涂料。我认为您的回答目前有点超出我的想象,但我现在至少可以研究并消化......谢谢。
【解决方案2】:

只要到项目的NuGet Packages Manager,搜索并安装这个Microsoft.Owin.Host.SystemWeb就可以使用using System.Web;来启用GetOwinContext()方法

【讨论】:

    【解决方案3】:

    DSR 在此链接中的回答对我有用

    Working in MVC 5 Identity for email verification

    您似乎缺少一个名为“Microsoft.Owin.Host.SystemWeb”的 NuGet 包。从 NuGet 安装此包或使用包管理器控制台安装该包。

    安装包 Microsoft.Owin.Host.SystemWeb

    希望这会有所帮助。

    【讨论】:

    • 在我的情况下工作;我一直在挑选 Owin 包裹,结果不小心把这个丢了!谢谢!
    【解决方案4】:

    谢谢 当我从NugetpackageManager. 添加Microsoft.Owin.Host.SystemWeb 时,它适用于我 它为HttpContext提供了扩展方法GetOwinContext()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多