Request.GetOwinContext नहीं मिल सकता है


101

मैं यह पता लगाने की कोशिश कर रहा हूं कि यह काम क्यों नहीं कर रहा है।

मेरे पास एक 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);
        }
    }
}

मैंने जो पढ़ा है, वह System.Net.Http का हिस्सा होना चाहिए, लेकिन मैंने इसे शामिल किया है और यह अभी भी हल नहीं हो रहा है। Ctrl-Space मुझे कोई भी इंटेलीजेंस विकल्प नहीं देता है।

मुझे यहां क्या समझ नहीं आ रहा है?


यह System.Web.Httpनामस्थान में है, लेकिन यह System.Web.Http.Owindll से है। क्या आपने इसका संदर्भ लिया है?
सिमोन

ठीक है, मैंने Microsoft.AspNet.WebApi.Owin के लिए नगेट पैकेज पाया और इसे स्थापित किया, और System.Web.Http और System.Web.Http.Owin के लिए उपयोग शामिल हैं, लेकिन यह अभी भी काम नहीं कर रहा है।
स्कॉटी

2
क्षमा करें, मेरी उपरोक्त टिप्पणी को System.Net.Httpनाम स्थान पढ़ना चाहिए । तो आप के लिए एक का उपयोग करने की जरूरत नहीं है .Owin, using System.Net.Httpजो आप पहले से ही है।
सिमोन

जवाबों:


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 चलाएं।
रोगाला

टोकन निरस्त करना बहुत कठिन है !!! लेकिन इस जवाब ने आखिरकार मुझे इसे काम करने में मदद की (साथ ही इसे db से डिलीट कर दिया, जिसकी मुझे एक्सेस है)। धन्यवाद!!
स्लिम्सगॉस्ट

मुझे भी यह समस्या है, लेकिन मैंने मुद्दे को सुलझाने के लिए Install-Package Microsoft.Owin.Host.SystemWeb का उपयोग किया है
hmfarimani

1
मुझे नहीं लगता कि इसे सही क्यों माना जाता है - इस विस्तार पद्धति का WebAPI से कोई लेना-देना नहीं है, और वास्तव में यह Microsoft.Owin.Host.SystemWebनहीं है Microsoft.AspNet.WebApi.Owin
जॉन

2
@ जॉन - यदि आप एक एपीआई नियंत्रक का उपयोग कर रहे हैं जो आपको चाहिए Microsoft.AspNet.WebApi.Owin। यदि आप एक नियमित एमवीसी नियंत्रक में हैं, तो आपको आवश्यकता होगी Microsoft.Owin.Host.SystemWebRequestवस्तु के आधार पर नियंत्रक आप ऐसा एक अलग विस्तार विधि का उपयोग कर रहे हैं टाइप अलग है।
साइमन सी।

49

इनमें से किसी ने भी मेरे लिए काम नहीं किया। मुझे Nuget पैकेज की तुलना एक पहचान के साथ की गई थी और मुझे यह Nuget पैकेज याद आ रहा है, जब मेरे साथ इस मुद्दे को जोड़ा गया था

Microsoft.Owin.Host.SystemWeb

जाहिरा तौर पर आपको ASP.NET अनुरोध पाइपलाइन का उपयोग करके IIS पर OWIN चलाने की आवश्यकता है (पढ़ें कि आप इसके बिना खराब हो गए हैं!)


2
आपको IIS पर चलने की आवश्यकता नहीं है।
ट्रेवर डे कोइकोक

1
@TrevordeKoekkoek हाँ, लेकिन यदि आप टिप्पणी को ठीक से पढ़ते हैं, तो यह कहता है कि आपको IIS पर चलने के लिए पुस्तकालय की आवश्यकता है (यदि आप IIS पर चलना चाहते हैं तो आप इस पुस्तकालय के बिना नहीं कर सकते)
Obi

1
आपको उस पैकेज के साथ-साथ System.Web का उपयोग करने की आवश्यकता है; बयान।
मुरारीयू सर्बान

इसने मेरे लिए मुद्दा तय कर दिया। धन्यवाद!
आर्टोरियस 2718

45

WEB एपीआई में, आप निम्नलिखित का उपयोग कर संदर्भ प्राप्त कर सकते हैं:

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

यह Identity 2.0 में काम करता है


5
-1 इसके लिए System.Web पर निर्भरता की आवश्यकता होती है, जो स्व-होस्टेड परिदृश्यों में उपलब्ध नहीं है।
कुगेल

6
इस समय के बाद, लोग अभी भी HttpContext.Current का उपयोग कर रहे हैं? यह परीक्षण योग्य नहीं है। संदर्भ इंजेक्ट किया जाना चाहिए।
ट्रेवर डे कोइकोक

1
केवल Nuget पैकेज Microsoft.Owin.Host.SystemWeb स्थापित करना मेरे लिए काम करता है
हिमालय गर्ग

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 से अतिरिक्त पैकेज डाउनलोड करता हूं, (पैकेज मैनेजर कंसोल में निम्न कमांड चलाएँ) Install-Package Microsoft.Owin.Host.SystemWeb


1
यह मेरे लिए भी समाधान था - फ्रेमवर्क 4.6.2 कंसोल ऐप
सेरेक्स

2

मुझे हमेशा के लिए एक सरल उत्तर खोजने के लिए ले लिया गया: लेकिन मैंने जो किया वह आईओविन कॉइनटेक्स्ट के एकल उदाहरण के गेट एक्सटेंशन का उपयोग करना था जो स्टार्टअप में त्वरित था। तो यह इस तरह से आया:

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

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

1

GetOwinContext()विस्तार विधि जीयूआई धागा अलावा अन्य धागे में नहीं मिला है।

इसलिए इस फंक्शन को किसी भी awaitएड फंक्शन के अंदर से न कहें ।


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

मुझे पैकेज याद आ रहा था: ApiControllers के लिए Microsoft.AspNet.WebApi.Owin। उम्मीद है की यह मदद करेगा!


1

मेरे पास एक ही समस्या थी और एक निजी विधि का उपयोग करके इसे हल किया: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

इसने मेरे लिए तैराकी का काम किया।


1

(कृपया ध्यान दें कि यह उत्तर ASP.NET वेब एपीआई के लिए है जो प्रश्न पर प्रयुक्त टैग से मेल खाता है। इस प्रश्न को देखें कि क्या आपकी जांच ASP.NET MVC के संबंध में है।)

यह प्रश्न निर्दिष्ट नहीं करता है कि ASP.NET वेब एपीआई सेवा की मेजबानी कैसे की जाती है । इस पोस्ट में संवाद इंगित करता है (मेरा जोर):

kichalla ने 24 अक्टूबर, 2014 को 1:35 बजे लिखा था

यदि आप स्वयं-होस्टिंग नहीं हैं, तो IIS के साथ Microsoft.AspNet.WebApi.Owin पैकेज का उपयोग न करें ... यह पैकेज केवल स्वयं होस्टिंग के साथ उपयोग किया जाना चाहिए ।

स्वीकृत उत्तरMicrosoft.AspNet.WebApi.Owin में पैकेज का उपयोग करने की सिफारिश की गई है । इस उत्तर में मैं यह बता रहा हूं कि IIS में ASP.NET वेब एपीआई सेवा की मेजबानी करते समय मेरे लिए क्या काम किया है ।

सबसे पहले, निम्नलिखित NuGet पैकेज स्थापित करें:

Microsoft.Owin.Host.SystemWeb

OWIN सर्वर जो ASP.NET अनुरोध पाइपलाइन का उपयोग करके IIS पर चलने के लिए OWIN- आधारित अनुप्रयोगों को सक्षम करता है।

(ध्यान दें कि जैसा कि मैं लिखता हूं, इस NuGet पैकेज का नवीनतम उपलब्ध संस्करण 3.1.0 है । इसके अलावा, यह जिस सीमा तक मायने रखता है, मैं Visual Studio 2013 अपडेट 5 का उपयोग कर रहा हूं।)

इस NuGet पैकेज को स्थापित करने के बाद, आप निम्नलिखित कार्य कर सकते हैं:

using Microsoft.Owin;
using System.Web;

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

अब, इन कथनों को हल करने के बारे में कुछ प्रकाश डाला जाए। विजुअल स्टूडियो में, यदि आप GetOwinContextकिसी भी स्टेटमेंट में राइट-क्लिक करते हैं और "पीक डेफिनिशन" चुनते हैं, तो विजुअल स्टूडियो निम्नलिखित प्रदर्शित करेगा:

// 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वर्ग पर।

आईआईएस में अपनी वेब एपीआई सेवा की मेजबानी करने वालों के लिए, मेरी आशा है कि यह किसी भी अस्पष्टता को साफ करता है कि GetOwinContext2017 में इस देर की तारीख के संबंध में एक परिभाषा कहां से मिल सकती है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.