Tidak dapat menemukan Request.GetOwinContext


101

Saya telah mencari selama satu jam mencoba mencari tahu mengapa ini tidak berhasil.

Saya memiliki aplikasi ASP.Net MVC 5 dengan WebAPI. Saya mencoba untuk mendapatkan Request.GetOwinContext (). Authentication, namun saya tidak dapat menemukan cara menyertakan GetOwinContext. Ini kode saya:

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

Dari apa yang saya baca, ini seharusnya menjadi bagian dari System.Net.Http, tetapi saya telah memasukkannya dan masih belum terselesaikan. Ctrl-Space juga tidak memberi saya opsi intellisense.

Apa yang kulewatkan di sini?


Ada di System.Web.Httpnamespace, tapi dari System.Web.Http.Owindll. Sudahkah Anda mereferensikan itu?
Simon C

Oke, saya menemukan paket nuget untuk Microsoft.AspNet.WebApi.Owin dan menginstalnya, dan menyertakan penggunaan untuk System.Web.Http dan System.Web.Http.Owin, tetapi masih tidak berfungsi.
Scottie

2
Maaf, komentar saya di atas seharusnya membaca System.Net.Httpnamespace. Jadi Anda tidak perlu menggunakan untuk .Owin, using System.Net.Httpyang sudah Anda miliki.
Simon C

Jawaban:


163

The GetOwinContextmetode ekstensi dalam System.Web.Http.Owindll yang perlu di-download sebagai paket nuget (Nama paket nuget adalah Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

Lihat msdn di sini: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Paket nuget disini: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Namun, metode ini masih merupakan bagian dari System.Net.Httpnamespace, jadi usingdefinisi yang Anda miliki seharusnya sudah cukup.

EDIT

Oke, untuk menghilangkan beberapa kebingungan: Jika Anda menggunakan ApiController (yaitu MyController : ApiController), Anda akan memerlukan Microsoft.AspNet.WebApi.Owinpaketnya.

Jika Anda menggunakan pengontrol Mvc biasa (yaitu MyController : Controller), Anda memerlukan Microsoft.Owin.Host.SystemWebpaketnya.

Di MVC 5, pipeline untuk Api dan MVC biasa sangat berbeda, tetapi sering kali memiliki konvensi penamaan yang sama. Jadi metode ekstensi di satu tidak berlaku untuk yang lain. Sama untuk banyak filter tindakan, dll.


Tautan kedua berhasil untuk saya. Jalankan saja Install-Package Microsoft.AspNet.WebApi.Owin di manajer paket Anda.
Rogala

Pencabutan token terlalu sulit !!! Tetapi jawaban ini akhirnya membantu saya membuatnya berfungsi (ditambah secara manual menghapusnya dari db, yang dapat saya akses). Terima kasih!!
SlimsGhost

Saya memiliki masalah ini juga, tetapi saya telah menggunakan Install-Package Microsoft.Owin.Host.SystemWeb untuk menyelesaikan masalah
hmfarimani

1
Saya tidak mengerti mengapa ini dianggap benar - metode ekstensi ini tidak ada hubungannya dengan WebAPI, dan memang ada Microsoft.Owin.Host.SystemWeb, tidak Microsoft.AspNet.WebApi.Owin.
Yohanes

2
@ John - Jika Anda menggunakan pengontrol API yang Anda butuhkan Microsoft.AspNet.WebApi.Owin. Jika Anda menggunakan pengontrol MVC biasa, Anda akan membutuhkannya Microsoft.Owin.Host.SystemWeb. The Requestobjek berbeda tergantung pada Pengontrol ketik Anda gunakan sehingga metode ekstensi yang berbeda.
Simon C

49

Tak satu pun dari ini berhasil untuk saya. Saya harus membandingkan paket Nuget dengan paket yang dibuat dengan Identity dan saya menemukan paket Nuget ini hilang yang ketika ditambahkan memperbaiki masalah untuk saya

Microsoft.Owin.Host.SystemWeb

Rupanya Anda membutuhkannya untuk menjalankan OWIN di IIS menggunakan pipeline permintaan ASP.NET (baca Anda kacau tanpa itu!)


2
Anda tidak harus menjalankan IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek ya tetapi jika Anda membaca komentar dengan benar, dikatakan Anda memerlukan perpustakaan untuk berjalan di IIS (Jika Anda ingin menjalankan IIS, Anda tidak dapat melakukannya tanpa perpustakaan ini)
Obi

1
Anda membutuhkan paket itu plus menggunakan System.Web; pernyataan.
Murariu Serban

Ini memperbaiki masalah saya. Terima kasih!
Artorias2718

45

Di WEB API, Anda bisa mendapatkan referensi menggunakan berikut ini:

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

ini berfungsi di Identity 2.0


5
-1 Ini membutuhkan ketergantungan pada System.Web, yang tidak tersedia dalam skenario yang dihosting sendiri.
Kugel

6
Setelah sekian lama, orang masih menggunakan HttpContext.Current? Itu tidak bisa diuji. konteks harus dimasukkan.
Trevor de Koekkoek

1
Hanya menginstal Paket Nuget Microsoft.Owin.Host.SystemWeb bekerja untuk saya
Himalaya Garg

21

Anda mungkin perlu menambahkan paket NuGet Microsoft.Owin.Host.SystemWebuntuk melakukan ini:

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

7

Dalam kasus saya, saya perlu menambahkan

using Microsoft.AspNet.Identity.Owin;

untuk menyelesaikan GetOwinContext dan kemudian GetUserManager di baris berikut.

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


2

Ini membutuhkan waktu lama bagi saya untuk menemukan jawaban sederhana: tetapi yang saya lakukan adalah menggunakan ekstensi Get dari satu instance IOwinContext yang dibuat saat startup. Jadi hasilnya seperti ini:

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

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

1

The GetOwinContext()metode penyuluhan tidak ditemukan di thread selain thread GUI.

Jadi berhati-hatilah untuk tidak memanggil fungsi ini dari dalam awaitfungsi ed mana pun .


1

Setelah melihat proyek default ASP.NET, saya menemukan saya perlu memasukkan ini ke dalam startup aplikasi saya:

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

Saya kehilangan paket: Microsoft.AspNet.WebApi.Owin untuk ApiControllers. Semoga ini membantu!


1

Saya memiliki masalah yang sama dan menyelesaikannya dengan menggunakan metode pribadi: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Ini bekerja dengan baik untuk saya.


1

(Harap perhatikan bahwa jawaban ini untuk ASP.NET Web API yang sesuai dengan tag yang digunakan pada pertanyaan. Lihat pertanyaan ini jika pertanyaan Anda berkaitan dengan ASP.NET MVC.)

Pertanyaan tidak menentukan bagaimana layanan ASP.NET Web API akan di- host . Dialog di posting ini menunjukkan (penekanan milik saya):

tulis kichalla 24 Okt 2014 pukul 1:35

Jika Anda TIDAK meng-hosting sendiri, jangan gunakan paket Microsoft.AspNet.WebApi.Owin dengan IIS ... paket ini seharusnya hanya digunakan dengan hosting mandiri .

Penggunaan Microsoft.AspNet.WebApi.Owinpaket direkomendasikan dalam jawaban yang diterima . Dalam jawaban ini saya melaporkan apa yang telah berhasil untuk saya saat menghosting layanan API Web ASP.NET di IIS .

Pertama, instal paket NuGet berikut:

Microsoft.Owin.Host.SystemWeb

OWIN server yang memungkinkan aplikasi berbasis OWIN untuk dijalankan di IIS menggunakan pipa permintaan ASP.NET.

(Perhatikan bahwa saat saya menulis, versi terbaru yang tersedia dari paket NuGet ini adalah 3.1.0 . Juga, sejauh mungkin penting, saya menggunakan Visual Studio 2013 Update 5.)

Setelah menginstal paket NuGet ini, Anda dapat melakukan hal berikut:

using Microsoft.Owin;
using System.Web;

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

Sekarang, untuk menjelaskan bagaimana pernyataan ini diselesaikan. Dalam Visual Studio, jika Anda mengklik kanan GetOwinContextdi salah satu pernyataan dan memilih "Peek Definition", Visual Studio akan menampilkan berikut ini:

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

Seperti yang Anda lihat, di dalam System.Webnamespace, ada dua GetOwinContext metode ekstensi:

  • Satu di HttpContextkelas, dan
  • Yang lainnya di HttpRequestkelas.

Sekali lagi, bagi mereka yang meng-hosting layanan API Web mereka di IIS, harapan saya adalah bahwa ini menghilangkan ambiguitas tentang di mana definisi untuk GetOwinContextdapat ditemukan sehubungan dengan tanggal akhir tahun 2017 ini.


0

Saya harus menambahkan paket Microsoft.AspNet.Identity.Owin

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.