找不到Request.GetOwinContext

Sco*_*tie 93 c# asp.net-web-api owin

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

我有一个带有WebAPI的ASP.Net MVC 5应用程序.我正在尝试获取Request.GetOwinContext().身份验证,但我似乎无法找到如何包含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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从我读过的内容来看,它应该是System.Net.Http的一部分,但我已经包含了它,但它仍然没有解决.Ctrl-Space也没有给我任何intellisense选项.

我在这里错过了什么?

Sim*_*n C 153

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

Install-Package Microsoft.AspNet.WebApi.Owin
Run Code Online (Sandbox Code Playgroud)

请在此处查看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的管道非常不同,但通常具有相同的命名约定.因此,一个扩展方法不适用于另一个.对于许多动作过滤器等​​也是如此

  • @John - 如果您使用的是API控制器,则需要"Microsoft.AspNet.WebApi.Owin".如果你在普通的MVC控制器中,你将需要`Microsoft.Owin.Host.SystemWeb`."Request"对象根据您使用的Controller类型而有所不同,因此使用不同的扩展方法. (2认同)

Obi*_*Obi 47

这些都不适合我.我不得不将Nuget软件包与使用Identity创建的软件包进行比较,我发现这个Nuget软件包丢失,添加时修复了我的问题

Microsoft.Owin.Host.SystemWeb
Run Code Online (Sandbox Code Playgroud)

显然你需要它使用ASP.NET请求管道在IIS上运行OWIN(如果没有它,请阅读你!)

  • 您不必在IIS上运行. (2认同)

小智 44

在WEB API中,您可以使用以下内容获取引用:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
Run Code Online (Sandbox Code Playgroud)

它适用于Identity 2.0

  • 毕竟这一次,人们还在使用HttpContext.Current?这是不可测试的.应注入上下文. (6认同)
  • -1这需要依赖于System.Web,这在自托管方案中不可用. (5认同)
  • @TrevordeKoekkoek只有这样我才能让它发挥作用. (4认同)

Ser*_*gan 21

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

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
Run Code Online (Sandbox Code Playgroud)


Muh*_*zan 7

在我的情况下,我需要添加

using Microsoft.AspNet.Identity.Owin;
Run Code Online (Sandbox Code Playgroud)

用于解析GetOwinContext,然后在以下行中解析GetUserManager.

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
Run Code Online (Sandbox Code Playgroud)


hmf*_*ani 5

我有这个问题,我从nuget下载了额外的软件包来解决我的问题,(在Package Manager Console中运行以下命令) Install-Package Microsoft.Owin.Host.SystemWeb