找不到Request.GetOwinContext


101

我一直在寻找一个小时,试图弄清楚为什么它不起作用。

我有一个带有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.Owindll。你有提到过吗?
西蒙C

好的,我找到并安装了Microsoft.AspNet.WebApi.Owin的nuget包,并包含了System.Web.Http和System.Web.Http.Owin的用法,但仍然无法正常工作。
Scottie

2
抱歉,我上面的评论应该已经读了System.Net.Http名称空间。所以,你不需要使用.Owin,只要using System.Net.Http你已经有了。
西蒙C

Answers:


163

GetOwinContext延伸方法是在System.Web.Http.Owin其中DLL 需要被下载为NuGet包(所述NuGet包名称是Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

请参阅此处的msdn:http : //msdn.microsoft.com/zh-cn/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。
Rogala 2014年

令牌撤销太难了!!!但是,这个答案最终帮助我使它正常工作(加上从具有访问权限的数据库中手动删除它)。谢谢!!
SlimsGhost 2015年

我也有这个问题,但是我已经使用Install-Package Microsoft.Owin.Host.SystemWeb解决了问题
hmfarimani

1
我不明白为什么这被认为是正确的-这种扩展方法与WebAPI无关,实际上它在Microsoft.Owin.Host.SystemWeb,而不是Microsoft.AspNet.WebApi.Owin
约翰·

2
@John-如果您使用的是API控制器,则需要使用Microsoft.AspNet.WebApi.Owin。如果您使用常规的MVC控制器,则将需要Microsoft.Owin.Host.SystemWeb。的Request对象是不同的,这取决于控制器类型您使用如此不同的扩展方法。
西蒙C

49

这些都不对我有用。我必须将Nuget软件包与使用Identity创建的软件包进行比较,我发现缺少此Nuget软件包,添加后为我解决了该问题

Microsoft.Owin.Host.SystemWeb

显然,您需要它来使用ASP.NET请求管道在IIS上运行OWIN(如果没有它,您将被搞砸了!)


2
您不必在IIS上运行。
Trevor de Koekkoek 2014年

1
@TrevordeKoekkoek是的,但是如果您正确阅读注释,它说您需要在IIS上运行该库(如果要在IIS上运行,则不能没有此库)
Obi 2014年

1
您需要该软件包以及一个使用System.Web的软件包;声明。
Murariu Serban 2015年

它为我解决了这个问题。谢谢!
Artorias2718 '19

45

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

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

它适用于Identity 2.0


5
-1这需要依赖System.Web,而在自托管方案中不可用。
库格尔2014年

6
在所有这些时间之后,人们仍在使用HttpContext.Current吗?这是不可测试的。应该注入上下文。
Trevor de Koekkoek 2014年

1
仅安装Nuget包Microsoft.Owin.Host.SystemWeb对我有用
Himalaya Garg

21

您可能需要添加NuGet软件包Microsoft.Owin.Host.SystemWeb才能执行此操作:

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

7

就我而言,我需要添加

using Microsoft.AspNet.Identity.Owin;

用于解决GetOwinContext,然后解决下一行中的GetUserManager。

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


2

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

private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();

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

1

GetOwinContext()扩展方法不低于GUI线程其他线程发现。

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


1

查看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);`

1

我缺少软件包:Microsoft.AspNet.WebApi.Owin for ApiControllers。希望这可以帮助!


1

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

这对我很有效。


1

(请注意,此答案是针对ASP.NET Web API的,它对应于问题中使用的标记。如果您的询问是针对ASP.NET MVC,请参见此问题。)

该问题未指定如何承载 ASP.NET Web API服务。这篇文章中的对话框指出(强调我的意思):

kichalla写于2014年10月24日,1:35

如果您不是自托管的,请不要将Microsoft.AspNet.WebApi.Owin 软件包与IIS一起使用...此软件包仅应与自托管一起使用。

Microsoft.AspNet.WebApi.Owin建议在已接受的答案中使用该程序包。在此答案中,我报告了在IIS中托管ASP.NET Web API服务时对我有用的方法

首先,安装以下NuGet软件包:

Microsoft.Owin.Host.SystemWeb

OWIN服务器,使基于OWIN的应用程序可以使用ASP.NET请求管道在IIS上运行。

(请注意,在我撰写本文时,此NuGet软件包的最新可用版本是3.1.0。此外,在某种程度上来说,我正在使用Visual Studio 2013 Update5。)

安装此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服务的用户,我希望这GetOwinContext可以消除有关在2017年这个较晚的日期可以找到其定义的地方的任何歧义。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.