ASP.NET Core で HttpContext.Current を取得するにはどうすればいいですか? [重複] 質問する

ASP.NET Core で HttpContext.Current を取得するにはどうすればいいですか? [重複] 質問する

現在、ASP.NET Core を使用して ASP.NET WebForms アプリケーションを書き直し/変換しています。可能な限り再エンジニアリングを避けるようにしています。

HttpContextクラスライブラリで現在の状態を確認するために使用するセクションがあります。.NET HttpContext.CurrentCore 1.0 ではどのようにアクセスすればよいですか?

 var current = HttpContext.Current;
     if (current == null)
      {
       // do something here
       // string connection = Configuration.GetConnectionString("MyDb");
      }

現在のアプリケーション ホストを構築するには、これにアクセスする必要があります。

$"{current.Request.Url.Scheme}://{current.Request.Url.Host}{(current.Request.Url.Port == 80 ? "" : ":" + current.Request.Url.Port)}";

ベストアンサー1

原則として、Web フォームまたは MVC5 アプリケーションを ASP.NET Core に変換するには、かなりの量のリファクタリングが必要になります。

HttpContext.CurrentASP.NET Core では削除されました。別のクラス ライブラリから現在の HTTP コンテキストにアクセスすることは、ASP.NET Core が回避しようとしている煩雑なアーキテクチャの一種です。ASP.NET Core でこれを再設計する方法はいくつかあります。

HttpContext プロパティ

任意のコントローラーの プロパティを介して現在の HTTP コンテキストにアクセスできます。元のコード サンプルに最も近いのは、呼び出しているメソッドにHttpContext渡すことです。HttpContext

public class HomeController : Controller
{
    public IActionResult Index()
    {
        MyMethod(HttpContext);

        // Other code
    }
}

public void MyMethod(Microsoft.AspNetCore.Http.HttpContext context)
{
    var host = $"{context.Request.Scheme}://{context.Request.Host}";

    // Other code
}

ミドルウェアの HttpContext パラメータ

書いている場合カスタムミドルウェアASP.NET Core パイプラインの場合、現在のリクエストは自動的にメソッドHttpContextに渡されますInvoke

public Task Invoke(HttpContext context)
{
    // Do something with the current HTTP context...
}

HTTP コンテキスト アクセサー

最後に、ヘルパー サービスを使用して、ASP.NET Core の依存関係挿入システムによって管理される任意のクラスの HTTP コンテキストを取得できますIHttpContextAccessor。これは、コントローラーによって使用される共通サービスがある場合に便利です。

コンストラクターでこのインターフェースを要求します。

public MyMiddleware(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

その後、現在の HTTP コンテキストに安全にアクセスできます。

var context = _httpContextAccessor.HttpContext;
// Do something with the current HTTP context...

IHttpContextAccessorデフォルトではサービスコンテナに追加されない場合もあるので、ConfigureServices念のため登録しておきましょう。

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    // if < .NET Core 2.2 use this
    //services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Other code...
}

おすすめ記事