Request.GetOwinContextが見つかりません


101

私は、なぜこれが機能しないのかを理解するために1時間探していました。

WebAPIを備えたASP.Net MVC 5アプリケーションがあります。Request.GetOwinContext()。Authenticationを取得しようとしていますが、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

OK、Microsoft.AspNet.WebApi.Owinのnugetパッケージを見つけてインストールし、System.Web.HttpとSystem.Web.Http.Owinの使用法を含めましたが、まだ機能していません。
スコッティ2014年

2
申し訳ありませんが、上記のコメントにはSystem.Net.Http名前空間が含まれているはずです。したがって.Owinusing System.Net.Httpすでに使用しているforを使用する必要はありません。
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のパイプラインは大きく異なりましたが、多くの場合、同じ命名規則があります。したがって、一方の拡張メソッドはもう一方には適用されません。多くのアクションフィルターなどで同じです。


2番目のリンクは私のために働いた。パッケージマネージャーでInstall-Package Microsoft.AspNet.WebApi.Owinを実行するだけです。
Rogala 2014

トークンの取り消しは難しいです!!! しかし、この回答は最終的にそれを機能させるのに役立ちました(さらに、私がアクセスできるdbから手動で削除しました)。ありがとうございました!!
SlimsGhost 2015年

私もこの問題を抱えていますが、Install-Package Microsoft.Owin.Host.SystemWebを使用して問題を解決しています
hmfarimani

1
これが正しいと見なされる理由はわかりません-この拡張メソッドはWebAPIとは何の関係もMicrosoft.Owin.Host.SystemWebありませんMicrosoft.AspNet.WebApi.Owin
ジョン

2
@John-APIコントローラを使用している場合に必要Microsoft.AspNet.WebApi.Owinです。通常のMVCコントローラーを使用している場合は、が必要になりますMicrosoft.Owin.Host.SystemWebRequestオブジェクトは、あなたがそう異なる拡張メソッドを使用しているコントローラの種類によって異なります。
Simon C

49

これらのどれも私にとってはうまくいきませんでした。NugetパッケージをIdentityで作成されたものと比較する必要があり、このNugetパッケージが見つからないため、追加すると問題が修正されました

Microsoft.Owin.Host.SystemWeb

どうやら、ASP.NETリクエストパイプラインを使用してIISでOWINを実行するために必要です(それなしでねじ込まれていることを読んでください!)


2
IISで実行する必要はありません。
Trevor de Koekkoek 2014年

1
@TrevordeKoekkoekはい、ただしコメントを正しく読んだ場合、IISで実行するためにライブラリが必要であると表示されます(IISで実行する場合、このライブラリなしでは実行できません)
Obi

1
そのパッケージと使用するSystem.Webが必要です。ステートメント。
Murariu Serban 2015

それで問題が解決しました。ありがとう!
Artorias2718

45

WEB APIでは、以下を使用して参照を取得できます。

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

Identity 2.0で動作します


5
-1これにはSystem.Webへの依存関係が必要ですが、これは自己ホスト型シナリオでは利用できません。
Kugel 14

6
結局のところ、人々はまだHttpContext.Currentを使用していますか?テストできません。コンテキストを注入する必要があります。
Trevor de Koekkoek 2014年

1
NugetパッケージMicrosoft.Owin.Host.SystemWebをインストールするだけでうまくいきました
Himalaya Garg

21

Microsoft.Owin.Host.SystemWebこれを行うには、NuGetパッケージを追加する必要がある場合があります。

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

7

私の場合、追加する必要があります

using Microsoft.AspNet.Identity.Owin;

GetOwinContextを解決してから、次の行でGetUserManagerを解決します。

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


2

これにより、簡単な答えを見つけるのに永遠にかかりました。ただし、起動時にインスタンス化されたIOwinContextの単一インスタンスのGet拡張を使用するだけでした。だから、このように出てきました:

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

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

1

GetOwinContext()拡張メソッドは、GUIスレッド以外のスレッドには見られません。

したがって、awaited関数内からこの関数を呼び出さないように注意してください。


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 Web APIに対するものであることに注意してください。お問い合わせがASP.NET MVCに関するものである場合は、この質問を参照してください。)

この質問では、ASP.NET Web APIサービスをホストする方法を指定していません。この投稿のダイアログは次のことを示しています(鉱山を強調):

kichallaが2014年10月24日1:35 AMに書き込み

セルフホスティングでない場合は、Microsoft.AspNet.WebApi.Owin パッケージをIISで使用しないでください。このパッケージは、セルフホスティングでのみ使用することを想定しています。

受け入れられた回答Microsoft.AspNet.WebApi.Owinでは、パッケージの使用をお勧めします。この回答では、IISでASP.NET Web APIサービスをホストするときに何が効果的かを報告しています

まず、次のNuGetパッケージをインストールします。

Microsoft.Owin.Host.SystemWeb

OWINベースのアプリケーションをASP.NET要求パイプラインを使用してIISで実行できるようにするOWINサーバー。

(私が書いているように、この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、いずれかのステートメントを右クリックして「ピークの定義」を選択すると、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名前空間内には2つの GetOwinContext拡張メソッドがあります。

  • HttpContextクラスに1人
  • HttpRequestクラスのもう一人。

繰り返しになりますが、IISでWeb APIサービスをホストしている人にとって、これGetOwinContextにより、2017年末日に関して定義が見つかる場所に関するあいまいさが解消されることを願っています。


0

パッケージを追加する必要がありました Microsoft.AspNet.Identity.Owin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.