Request.GetOwinContext bulunamıyor


101

Bunun neden işe yaramadığını anlamaya çalışırken bir saattir aradım.

WebAPI ile bir ASP.Net MVC 5 uygulamam var. Request.GetOwinContext (). Authentication almaya çalışıyorum, ancak GetOwinContext'i nasıl dahil edeceğimi bulamıyorum. İşte kodum:

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

Okuduklarıma göre, System.Net.Http'nin bir parçası olmalı, ancak bunu ekledim ve hala çözülmüyor. Ctrl-Space bana herhangi bir akıllıca seçenek sunmuyor.

Burada neyi özlüyorum?


Bu öyle System.Web.Httpad, ama nereden olduğunu System.Web.Http.Owindll. Buna referans verdin mi?
Simon C

Tamam, Microsoft.AspNet.WebApi.Owin için nuget paketini buldum ve yükledim ve System.Web.Http ve System.Web.Http.Owin için kullanımları dahil ettim, ancak yine de çalışmıyor.
Scottie

2
Üzgünüm, yukarıdaki yorumum System.Net.Httpad alanını okumalıydı . Eğer bir için kullanarak gerekmez Yani .Owin, sadece using System.Net.Httpzaten var olan.
Simon C

Yanıtlar:


162

GetOwinContextUzantı yöntemi olup System.Web.Http.OwinDLL bir Nuget paket olarak indirilebilir gerekmektedir (Nuget paket adı Microsoft.AspNet.WebApi.Owin olduğu)

Install-Package Microsoft.AspNet.WebApi.Owin

Msdn'ye buradan bakın: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Nuget paketi burada: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Ancak, yöntem hala System.Net.Httpad alanının bir parçasıdır , bu nedenleusing sahip olduğunuz tanımlar iyi olmalıdır.

DÜZENLE

Tamam, bazı karışıklıkları gidermek için: Bir ApiController (yani MyController : ApiController) kullanıyorsanız , Microsoft.AspNet.WebApi.Owinpakete ihtiyacınız olacak .

Normal bir Mvc denetleyici (yani MyController : Controller) kullanıyorsanız , Microsoft.Owin.Host.SystemWebpakete ihtiyacınız olacaktır .

MVC 5'te Api ve normal MVC için ardışık düzenler çok farklıydı, ancak genellikle aynı adlandırma kurallarına sahipti. Dolayısıyla, birinde bir uzatma yöntemi diğerine uygulanmaz. Birçok eylem filtresi vb. İçin aynı


İkinci bağlantı benim için çalıştı. Paket yöneticinizde Install-Package Microsoft.AspNet.WebApi.Owin'i çalıştırın.
Rogala

Jeton iptali çok zor !!! Ama bu cevap nihayet onu çalıştırmama yardımcı oldu (artı erişimim olan db'den manuel olarak silme). Teşekkür ederim!!
SlimsGhost

Bende de bu sorun var ama sorunu çözmek için Install-Package Microsoft.Owin.Host.SystemWeb kullandım
hmfarimani

1
Bunun neden doğru kabul edildiğini anlamıyorum - bu uzantı yönteminin WebAPI ile hiçbir ilgisi yok ve aslında var Microsoft.Owin.Host.SystemWeb, değil Microsoft.AspNet.WebApi.Owin.
John

2
@John - Bir API denetleyicisi kullanıyorsanız ihtiyacınız var Microsoft.AspNet.WebApi.Owin. Normal bir MVC kontrol cihazındaysanız ihtiyacınız olacak Microsoft.Owin.Host.SystemWeb. RequestNesnesi bağlı Kontrol farklı bir uzantısı yöntem böylece kullanan tip farklıdır.
Simon C

50

Bunların hiçbiri benim için işe yaramadı. Nuget paketlerini Identity ile oluşturulmuş bir paketle karşılaştırmak zorunda kaldım ve bu Nuget paketini eksik buldum, bu da eklendiğinde sorunu benim için düzeltti

Microsoft.Owin.Host.SystemWeb

Görünüşe göre, ASP.NET istek ardışık düzenini kullanarak IIS üzerinde OWIN çalıştırmanız gerekiyor (onsuz işin bittiğini okuyun!)


2
IIS üzerinde çalıştırmanız gerekmez.
Trevor de Koekkoek

1
@TrevordeKoekkoek evet ama yorumu doğru bir şekilde okursanız, kütüphanenin IIS üzerinde çalışması gerektiğini söylüyor (IIS üzerinde çalıştırmak istiyorsanız bu kütüphane olmadan yapamazsınız)
Obi

1
bu paketin yanı sıra System.Web'i kullanmanız gerekir; Beyan.
Murariu Serban

Benim için sorunu çözdü. Teşekkürler!
Artorias2718

45

WEB API'de, aşağıdakileri kullanarak referansı alabilirsiniz:

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

Identity 2.0'da çalışır


5
-1 Bu, kendi kendine barındırılan senaryolarda bulunmayan System.Web'e bağımlılık gerektirir.
Kugel

6
Bunca zamandan sonra, insanlar hala HttpContext.Current kullanıyor? Test edilemez. bağlam enjekte edilmelidir.
Trevor de Koekkoek

1
Yalnızca Nuget Paketini yüklemek Microsoft.Owin.Host.SystemWeb benim için çalıştı
Himalaya Garg

21

Bunu yapmak için NuGet paketini eklemeniz gerekebilir Microsoft.Owin.Host.SystemWeb:

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

7

Benim durumumda eklemem gerekiyor

using Microsoft.AspNet.Identity.Owin;

GetOwinContext'i ve ardından GetUserManager'ı aşağıdaki satırda çözmek için.

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


2

Bu, basit bir cevap bulmam sonsuza kadar sürdü: ama yaptığım şey, başlangıçta başlatılan IOwinContext'in tek örneğinin Get uzantısını kullanmaktı. Yani şöyle çıktı:

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

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

2

(Lütfen bu yanıtın soruda kullanılan etikete karşılık gelen ASP.NET Web API için olduğunu unutmayın. Sorunuz ASP.NET MVC ile ilgiliyse bu soruya bakın .)

Soru, ASP.NET Web API hizmetinin nasıl barındırılacağını belirtmez . İletişim bu yazı (vurgu benim) gösterir:

kichalla 24 Ekim 2014, 1:35 AM yazdı

Kendi kendinize barındırmıyorsanız, Microsoft.AspNet.WebApi.Owin paketini IIS ile kullanmayın ... bu paketin yalnızca kendi kendine barındırma ile kullanılması gerekir .

Kullanımı Microsoft.AspNet.WebApi.Owinpaketinde önerilir kabul cevap . Bu yanıtta , IIS'de bir ASP.NET Web API hizmeti barındırırken benim için neyin işe yaradığını bildiriyorum .

İlk önce aşağıdaki NuGet paketini yükleyin:

Microsoft.Owin.Host.SystemWeb

OWIN tabanlı uygulamaların ASP.NET istek ardışık düzenini kullanarak IIS üzerinde çalışmasını sağlayan OWIN sunucusu.

(Yazarken, bu NuGet paketinin mevcut en son sürümünün 3.1.0 olduğunu unutmayın . Ayrıca, önemli olabileceği ölçüde, Visual Studio 2013 Güncelleştirme 5'i kullanıyorum.)

Bu NuGet paketini yükledikten sonra şunları yapabilirsiniz:

using Microsoft.Owin;
using System.Web;

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

Şimdi, bu ifadelerin nasıl çözüldüğüne biraz ışık tutmak için. Visual Studio'da, GetOwinContextifadelerden herhangi birine sağ tıklayıp "Peek Definition" öğesini seçerseniz, Visual Studio aşağıdakileri görüntüler:

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

Gördüğünüz gibi System.Webad alanı içinde iki GetOwinContext uzantı yöntemi vardır:

  • One HttpContextsınıfı ve
  • HttpRequestSınıftaki diğeri .

Yine, Web API hizmetlerini IIS'de barındıranlar için, umarım GetOwinContextbu, 2017'deki bu geç tarihe göre bir tanımın nerede bulunabileceğine ilişkin herhangi bir belirsizliği ortadan kaldırmasıdır.


1

GetOwinContext()Uzantı yöntemi GUI parçacığı dışında konuda bulunamadı.

Bu nedenle, bu işlevi herhangi bir awaited işlevinden çağırmamaya dikkat edin .


1

ASP.NET varsayılan projesine baktıktan sonra, bunu uygulama başlangıcıma dahil etmem gerektiğini keşfettim:

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

Paket eksikti: ApiControllers için Microsoft.AspNet.WebApi.Owin. Bu yardımcı olur umarım!


1

Aynı sorunu yaşadım ve özel bir yöntem kullanarak çözdüm: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Bu benim için çok çalıştı.


0

Paket eklemek zorunda kaldım Microsoft.AspNet.Identity.Owin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.