現在、ASP.NET Core を使用して ASP.NET WebForms アプリケーションを書き直し/変換しています。可能な限り再エンジニアリングを避けるようにしています。
HttpContext
クラスライブラリで現在の状態を確認するために使用するセクションがあります。.NET HttpContext.Current
Core 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.Current
ASP.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...
}