Không thể tìm thấy Request.GetOwinContext


101

Tôi đã tìm kiếm trong một giờ để cố gắng tìm ra lý do tại sao điều này không hoạt động.

Tôi có ứng dụng ASP.Net MVC 5 với WebAPI. Tôi đang cố gắng lấy Request.GetOwinContext (). Xác thực, tuy nhiên, dường như tôi không thể tìm thấy cách bao gồm GetOwinContext. Đây là mã của tôi:

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);
        }
    }
}

Từ những gì tôi đã đọc, nó phải là một phần của System.Net.Http, nhưng tôi đã bao gồm điều đó và nó vẫn không giải quyết được. Ctrl-Space cũng không cung cấp cho tôi bất kỳ tùy chọn intellisense nào.

Tôi còn thiếu gì ở đây?


Nó nằm trong System.Web.Httpkhông gian tên, nhưng nó là từ System.Web.Http.Owindll. Bạn đã tham khảo điều đó chưa?
Simon C

Được rồi, tôi đã tìm thấy gói nuget cho Microsoft.AspNet.WebApi.Owin và cài đặt nó, cũng như bao gồm các công dụng cho System.Web.Http và System.Web.Http.Owin, nhưng nó vẫn không hoạt động.
Scottie

2
Xin lỗi, bình luận ở trên của tôi nên có System.Net.Httpkhông gian tên đọc . Vì vậy, bạn không cần sử dụng cho .Owin, chỉ cần using System.Net.Httpbạn đã có.
Simon C

Câu trả lời:


163

Các GetOwinContextphương pháp khuyến nông là trong System.Web.Http.Owindll mà cần phải được tải về như là một gói NuGet (Tên gói NuGet là Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

Xem msdn tại đây: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Gói Nuget tại đây: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Tuy nhiên, phương thức vẫn là một phần của System.Net.Httpkhông gian tên, vì vậy các usingđịnh nghĩa bạn có sẽ ổn.

BIÊN TẬP

Được rồi, để giải quyết một số nhầm lẫn: Nếu bạn đang sử dụng ApiController (tức là MyController : ApiController), bạn sẽ yêu cầu Microsoft.AspNet.WebApi.Owingói.

Nếu bạn đang sử dụng bộ điều khiển Mvc thông thường (tức là MyController : Controller), bạn sẽ cần Microsoft.Owin.Host.SystemWebgói.

Trong MVC 5, đường ống cho Api và MVC thông thường rất khác nhau, nhưng thường có cùng quy ước đặt tên. Vì vậy, một phương pháp mở rộng trong một không áp dụng cho khác. Tương tự cho rất nhiều bộ lọc hành động, v.v.


Liên kết thứ hai đã làm việc cho tôi. Chỉ cần chạy Install-Package Microsoft.AspNet.WebApi.Owin trong trình quản lý gói của bạn.
Rogala

Thu hồi mã thông báo quá khó !!! Nhưng câu trả lời này cuối cùng đã giúp tôi làm cho nó hoạt động (cộng với việc xóa thủ công nó khỏi db mà tôi có quyền truy cập). Cảm ơn bạn!!
SlimsGhost

Tôi có vấn đề này quá nhưng tôi đã sử dụng Cài đặt-Package Microsoft.Owin.Host.SystemWeb để giải quyết vấn đề
hmfarimani

1
Tôi không hiểu tại sao điều này được coi là đúng - phương thức mở rộng này không liên quan gì đến WebAPI, và thực sự thì nó Microsoft.Owin.Host.SystemWebkhông phải vậy Microsoft.AspNet.WebApi.Owin.
John,

2
@John - Nếu bạn đang sử dụng bộ điều khiển API mà bạn cần Microsoft.AspNet.WebApi.Owin. Nếu bạn đang sử dụng bộ điều khiển MVC thông thường, bạn sẽ cần Microsoft.Owin.Host.SystemWeb. Đối Requesttượng khác nhau tùy thuộc vào loại Bộ điều khiển bạn đang sử dụng nên một phương thức mở rộng khác nhau.
Simon C,

49

Không ai trong số này làm việc cho tôi. Tôi đã phải so sánh các gói Nuget với một gói được tạo bằng Identity và tôi thấy gói Nuget này bị thiếu, khi thêm vào đã khắc phục sự cố cho tôi

Microsoft.Owin.Host.SystemWeb

Rõ ràng là bạn cần nó để chạy OWIN trên IIS bằng cách sử dụng đường dẫn yêu cầu ASP.NET (đọc là bạn đã bị hỏng khi không có nó!)


2
bạn không cần phải chạy trên IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek có nhưng nếu bạn đọc những nhận xét đúng nó nói rằng bạn cần thư viện để chạy trên IIS (Nếu bạn muốn chạy trên IIS bạn không thể làm mà không có thư viện này)
Obi

1
bạn cần gói đó cộng với sử dụng System.Web; tuyên bố.
Murariu Serban

Nó đã khắc phục sự cố cho tôi. Cảm ơn!
Artorias2718

45

Trong WEB API, bạn có thể lấy tham chiếu bằng cách sử dụng như sau:

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

nó hoạt động trong Identity 2.0


5
-1 Điều này yêu cầu sự phụ thuộc vào System.Web, không có sẵn trong các trường hợp tự lưu trữ.
Kugel

6
Sau ngần ấy thời gian, mọi người vẫn đang sử dụng HttpContext.Current? Nó không thể kiểm tra được. bối cảnh nên được đưa vào.
Trevor de Koekkoek

1
Chỉ cài đặt NuGet Package Microsoft.Owin.Host.SystemWeb làm việc cho tôi
Himalaya Garg

21

Bạn có thể cần thêm gói NuGet Microsoft.Owin.Host.SystemWebđể thực hiện việc này:

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

7

Trong trường hợp của tôi, tôi cần thêm

using Microsoft.AspNet.Identity.Owin;

để giải quyết GetOwinContext và sau đó GetUserManager ở dòng sau.

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

5

Tôi gặp sự cố này và tôi tải xuống gói bổ sung từ nuget để giải quyết vấn đề của mình, (chạy lệnh sau trong Bảng điều khiển Trình quản lý Gói) Install-Package Microsoft.Owin.Host.SystemWeb


1
Đây là giải pháp cho tôi là tốt - Khung 4.6.2 Bảng điều khiển ứng dụng
Serexx

2

Điều này khiến tôi mãi mãi mới tìm được câu trả lời đơn giản: nhưng những gì tôi đã làm là sử dụng phần mở rộng Get của phiên bản IOwinContext đơn lẻ đã được khởi chạy trong phần khởi động. Vì vậy, nó xuất hiện như thế này:

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

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

1

Các GetOwinContext()phương pháp khuyến nông không được tìm thấy trong các chủ đề khác với thread GUI.

Vì vậy, hãy cẩn thận để không gọi hàm này từ bên trong bất kỳ awaithàm ed nào .


1

Sau khi xem xét dự án mặc định ASP.NET, tôi phát hiện ra rằng tôi cần đưa nó vào khởi động ứng dụng của mình:

// 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

Tôi đã thiếu gói: Microsoft.AspNet.WebApi.Owin cho ApiControllers. Hi vọng điêu nay co ich!


1

Tôi đã gặp vấn đề tương tự và đã giải quyết nó bằng cách sử dụng một phương pháp riêng: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Điều này đã làm việc hiệu quả đối với tôi.


1

(Xin lưu ý rằng câu trả lời này dành cho ASP.NET Web API tương ứng với thẻ được sử dụng trên câu hỏi. Hãy xem câu hỏi này nếu câu hỏi của bạn liên quan đến ASP.NET MVC.)

Câu hỏi không chỉ rõ cách dịch vụ ASP.NET Web API được lưu trữ . Hộp thoại trong bài đăng này cho biết (tôi nhấn mạnh):

Browsehalla đã viết ngày 24 tháng 10 năm 2014 lúc 1:35 sáng

Nếu bạn KHÔNG tự lưu trữ, không sử dụng gói Microsoft.AspNet.WebApi.Owin với IIS ... gói này chỉ được sử dụng với tự lưu trữ .

Sử dụng Microsoft.AspNet.WebApi.Owingói được khuyến nghị trong câu trả lời được chấp nhận . Trong câu trả lời này, tôi đang báo cáo những gì đã làm việc cho tôi khi lưu trữ dịch vụ ASP.NET Web API trong IIS .

Trước tiên, hãy cài đặt gói NuGet sau:

Microsoft.Owin.Host.SystemWeb

Máy chủ OWIN cho phép các ứng dụng dựa trên OWIN chạy trên IIS bằng cách sử dụng đường dẫn yêu cầu ASP.NET.

(Lưu ý rằng khi tôi viết, phiên bản mới nhất hiện có của gói NuGet này là 3.1.0 . Ngoài ra, trong phạm vi vấn đề có thể xảy ra, tôi đang sử dụng Visual Studio 2013 Update 5.)

Sau khi cài đặt gói NuGet này, bạn có thể làm như sau:

using Microsoft.Owin;
using System.Web;

IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();

Bây giờ, để làm sáng tỏ cách những tuyên bố này được giải quyết. Trong Visual Studio, nếu bạn nhấp chuột phải vào GetOwinContextmột trong hai câu lệnh và chọn "Peek Definition", Visual Studio sẽ hiển thị như sau:

// 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);
    }
}

Như bạn có thể thấy, trong System.Webkhông gian tên, có hai GetOwinContext phương thức mở rộng:

  • Một trên HttpContextlớp, và
  • Khác trên HttpRequestlớp.

Một lần nữa, đối với những người lưu trữ dịch vụ API Web của họ trong IIS, hy vọng của tôi là điều này sẽ xóa bỏ mọi sự mơ hồ liên quan đến nơi GetOwinContextcó thể tìm thấy định nghĩa liên quan đến ngày cuối năm 2017 này.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.