web-dev-qa-db-ja.com

Request.GetOwinContextが見つかりません

私はこれがなぜ機能しないのかを理解しようとして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でもインテリセンスオプションは提供されません。

ここで何が欠けていますか?

91
Scottie

GetOwinContext拡張メソッドはSystem.Web.Http.Owin dllにあり、これは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のパイプラインは非常に異なっていましたが、多くの場合同じ命名規則があります。したがって、一方の拡張メソッドはもう一方には適用されません。多くのアクションフィルターなどで同じです。

149
Simon C

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

Microsoft.Owin.Host.SystemWeb

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

47
Obi Onuorah

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

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

identity 2.0で動作します

42
user3572087

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

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
20
Serj Sagan

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

using Microsoft.AspNet.Identity.Owin;

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

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
7
Muhammad Ramzan

この問題があり、問題を解決するためにnugetから追加のパッケージをダウンロードします(パッケージマネージャーコンソールで次のコマンドを実行します) Install-Package Microsoft.Owin.Host.SystemWeb

5
hmfarimani

これは簡単な答えを見つけるのに永遠にかかりました:しかし、私がしたことは、スタートアップでインスタンス化されたIOwinContextの単一インスタンスのGet拡張を使用することでした。そのため、次のようになりました。

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

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

パッケージが欠落していました:Microsoft.AspNet.WebApi.Owin for ApiControllers。お役に立てれば!

1
D-Go

GetOwinContext()拡張メソッドは、GUIスレッド以外のスレッドでは見つかりません。

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

1
AxD

これと同じ問題があり、プライベートメソッドを使用して解決しました:private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

これは私のために泳ぎました。

1
user5655470

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
drobison

(この回答は、質問で使用されるタグに対応するASP.NET Web API用です。問い合わせがASP.NETに関する場合は、 この質問 を参照してください。 MVC。)

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

kichallaは2014年10月24日午前1時35分に書いた

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

受け入れられた答えMicrosoft.AspNet.WebApi.Owinパッケージの使用を推奨します。この回答では、IISでASP.NET Web APIサービスをホストしている場合に何が機能したかを報告しています。

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

Microsoft.Owin.Host.SystemWeb

ASP.NET要求パイプラインを使用して、OWINベースのアプリケーションを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名前空間内には、twoGetOwinContext拡張メソッドがあります。

  • HttpContextクラスの1つ、および
  • HttpRequestクラスのもう1つ。

繰り返しになりますが、IISでWeb APIサービスをホストしている人たちにとって、2017年後半にGetOwinContextの定義がどこで見つかるかについてのあいまいさが解消されることを期待しています。

1
DavidRR

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

0
GraehamF