ไม่พบ Request.GetOwinContext


101

ฉันค้นหามาเป็นชั่วโมงแล้วโดยพยายามหาสาเหตุว่าทำไมจึงไม่ได้ผล

ฉันมีแอปพลิเคชัน ASP.Net MVC 5 พร้อม WebAPI ฉันกำลังพยายามขอ 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);
        }
    }
}

จากสิ่งที่ฉันอ่านมันควรเป็นส่วนหนึ่งของ System.Net.Http แต่ฉันได้รวมไว้แล้วและยังไม่สามารถแก้ไขได้ Ctrl-Space ไม่ได้ให้ตัวเลือก intellisense แก่ฉันด้วย

ฉันพลาดอะไรไปที่นี่?


อยู่ในSystem.Web.Httpเนมสเปซ แต่มาจากSystem.Web.Http.Owindll คุณได้อ้างอิงว่า?
Simon C

โอเคฉันพบแพ็คเกจ nuget สำหรับ Microsoft.AspNet.WebApi.Owin และติดตั้งและรวมการใช้งานสำหรับ System.Web.Http และ System.Web.Http.Owin แต่ก็ยังใช้งานไม่ได้
Scottie

2
ขออภัยความคิดเห็นข้างต้นของฉันควรอ่านSystem.Net.Httpเนมสเปซแล้ว ดังนั้นคุณจึงไม่จำเป็นต้องใช้สำหรับ.Owinเพียงusing System.Net.Httpที่คุณมีอยู่แล้ว
Simon C

คำตอบ:


163

GetOwinContextวิธีขยายอยู่ในSystem.Web.Http.Owindll ซึ่งจะต้องมีการดาวน์โหลดเป็นแพคเกจ 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 ในตัวจัดการแพ็คเกจของคุณ
Rogala

การเพิกถอนโทเค็นยากเกินไป !!! แต่ในที่สุดคำตอบนี้ก็ช่วยให้ฉันใช้งานได้ (รวมถึงลบออกจากฐานข้อมูลด้วยตนเองซึ่งฉันสามารถเข้าถึงได้) ขอบคุณ!!
SlimsGhost

ฉันมีปัญหานี้เหมือนกัน แต่ฉันใช้ Install-Package Microsoft.Owin.Host.SystemWeb เพื่อแก้ปัญหา
hmfarimani

1
ฉันไม่ได้รับทำไมนี้จะถือว่าถูกต้อง - วิธีขยายนี้มีอะไรจะทำอย่างไรกับ WebAPI และแน่นอนมันอยู่ในไม่Microsoft.Owin.Host.SystemWeb Microsoft.AspNet.WebApi.Owin
John

2
@ John - หากคุณกำลังใช้ควบคุม API Microsoft.AspNet.WebApi.Owinที่คุณต้องการ ถ้าคุณอยู่ในตัวควบคุม MVC Microsoft.Owin.Host.SystemWebปกติคุณจะต้อง Requestวัตถุที่แตกต่างกันขึ้นอยู่กับตัวควบคุมประเภทที่คุณกำลังใช้ดังนั้นวิธีขยายที่แตกต่างกัน
Simon C

49

สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน ฉันต้องเปรียบเทียบแพ็คเกจ Nuget กับแพ็คเกจที่สร้างขึ้นด้วย Identity และฉันพบว่าแพ็คเกจ Nuget นี้หายไปซึ่งเมื่อเพิ่มได้แก้ไขปัญหาให้ฉัน

Microsoft.Owin.Host.SystemWeb

เห็นได้ชัดว่าคุณจำเป็นต้องใช้มันเพื่อเรียกใช้ OWIN บน IIS โดยใช้ไปป์ไลน์คำขอ ASP.NET (อ่านว่าคุณเมาโดยไม่ใช้มัน!)


2
คุณไม่จำเป็นต้องรันบน IIS
Trevor de Koekkoek

1
@TrevordeKoekkoek ใช่ แต่ถ้าคุณอ่านความคิดเห็นอย่างถูกต้องมันบอกว่าคุณต้องใช้ไลบรารีเพื่อทำงานบน IIS (หากคุณต้องการเรียกใช้บน IIS คุณไม่สามารถทำได้หากไม่มีไลบรารีนี้)
Obi

1
คุณต้องการแพ็คเกจนั้นพร้อมกับ System.Web ที่ใช้; คำให้การ.
Murariu Serban

มันแก้ไขปัญหาให้ฉัน ขอบคุณ!
Artorias2718

45

ใน WEB API คุณสามารถรับข้อมูลอ้างอิงได้โดยใช้สิ่งต่อไปนี้:

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

มันทำงานใน Identity 2.0


5
-1 สิ่งนี้ต้องการการพึ่งพา System.Web ซึ่งไม่มีในสถานการณ์ที่โฮสต์ด้วยตนเอง
Kugel

6
หลังจากเวลานี้ผู้คนยังคงใช้ HttpContext.Current? ไม่สามารถทดสอบได้ ควรฉีดบริบท
Trevor de Koekkoek

1
เฉพาะการติดตั้ง Nuget Package 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>();

5

ฉันมีปัญหานี้และฉันดาวน์โหลดแพ็คเกจเพิ่มเติมจาก nuget เพื่อแก้ปัญหาของฉัน (เรียกใช้คำสั่งต่อไปนี้ใน Package Manager Console) ติดตั้งแพ็คเกจ Microsoft.Owin.Host.SystemWeb


1
นี่เป็นวิธีแก้ปัญหาสำหรับฉันเช่นกัน - แอปคอนโซล Framework 4.6.2
Serexx

2

สิ่งนี้ทำให้ฉันต้องใช้เวลาตลอดไปเพื่อค้นหาคำตอบง่ายๆ: แต่สิ่งที่ฉันทำคือใช้ส่วนขยาย Get ของอินสแตนซ์เดียวของ IOwinContext ที่สร้างอินสแตนซ์ในการเริ่มต้น มันจึงออกมาดังนี้:

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

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

1

GetOwinContext()วิธีขยายไม่พบในหัวข้ออื่น ๆ กว่าด้ายกุย

ดังนั้นระวังอย่าเรียกใช้ฟังก์ชันนี้จากภายในawaitฟังก์ชัน ed ใด ๆ


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 สำหรับ ApiControllers หวังว่านี่จะช่วยได้!


1

ฉันมีปัญหาเดียวกันนี้และแก้ไขได้โดยใช้วิธีส่วนตัว: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

สิ่งนี้ใช้ได้ผลกับฉัน


1

(โปรดทราบว่าคำตอบนี้ใช้สำหรับ ASP.NET Web API ซึ่งตรงกับแท็กที่ใช้กับคำถามดูคำถามนี้หากคำถามของคุณเกี่ยวข้องกับ ASP.NET MVC)

คำถามไม่ได้ระบุว่าจะโฮสต์บริการ ASP.NET Web API อย่างไร กล่องโต้ตอบในโพสต์นี้ระบุว่า (เน้นของฉัน):

kichalla เขียนเมื่อ 24 ต.ค. 2014 เวลา 01:35 น

หากคุณไม่ได้โฮสต์ด้วยตนเองอย่าใช้Microsoft.AspNet.WebApi.Owin แพ็คเกจกับ IIS ... แพ็คเกจนี้ควรใช้กับโฮสติ้งตัวเองเท่านั้น

การใช้งานของMicrosoft.AspNet.WebApi.Owinแพคเกจที่จะแนะนำในคำตอบที่ได้รับการยอมรับ ในคำตอบนี้ฉันกำลังรายงานสิ่งที่ได้ผลสำหรับฉันเมื่อโฮสต์บริการ ASP.NET Web API ใน IISIIS

ขั้นแรกให้ติดตั้งแพ็คเกจ 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ชั้นเรียน

อีกครั้งสำหรับผู้ที่โฮสต์บริการ Web API ของตนใน IIS ความหวังของฉันก็คือสิ่งนี้จะช่วยขจัดความคลุมเครือใด ๆ เกี่ยวกับคำจำกัดความที่GetOwinContextสามารถพบได้ในช่วงปลายปี 2017 นี้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.