次の方法で共有


IActionContextAccessor と ActionContextAccessor は廃止されました

IActionContextAccessorActionContextAccessor は、診断 ID ASPDEPR006で古い形式としてマークされています。 エンドポイント ルーティングの導入により、開発者はIActionContextAccessorを介してアクション記述子とメタデータ情報に直接アクセスできるため、HttpContext.GetEndpoint()は不要になります。

導入されたバージョン

.NET 10 Preview 7

以前の動作

以前は、 IActionContextAccessor を使用して現在の ActionContextにアクセスできました。

public class MyService
{
   private readonly IActionContextAccessor _actionContextAccessor;

   public MyService(IActionContextAccessor actionContextAccessor)
   {
       _actionContextAccessor = actionContextAccessor;
   }

   public void DoSomething()
   {
       var actionContext = _actionContextAccessor.ActionContext;
       var actionDescriptor = actionContext?.ActionDescriptor;
       // Use action descriptor metadata.
   }
}

新しい動作

.NET 10 以降では、 IActionContextAccessorActionContextAccessor を使用すると、診断 ID ASPDEPR006を含むコンパイラ警告が生成されます。

警告ASPDEPR006: ActionContextAccessor は廃止され、今後のバージョンで削除される予定です。 詳細については、https://aka.ms/aspnet/deprecate/006 を参照してください。

破壊的変更の種類

この変更は、ソースの互換性に影響を与える可能性があります

変更の理由

ASP.NET Core でのエンドポイント ルーティングの導入により、 IActionContextAccessor は不要になります。 エンドポイント ルーティング インフラストラクチャは、エンドポイント ルーティングに向けた ASP.NET Core のアーキテクチャの進化に合わせて、 HttpContext.GetEndpoint()を介してエンドポイント メタデータにアクセスするためのよりクリーンで直接的な方法を提供します。

IActionContextAccessorからIHttpContextAccessorに移行し、HttpContext.GetEndpoint()を使用します。

以前は:

public class MyService
{
   private readonly IActionContextAccessor _actionContextAccessor;

   public MyService(IActionContextAccessor actionContextAccessor)
   {
       _actionContextAccessor = actionContextAccessor;
   }

   public void DoSomething()
   {
       var actionContext = _actionContextAccessor.ActionContext;
       var actionDescriptor = actionContext?.ActionDescriptor;
       // Use action descriptor metadata
   }
}

その後:

public class MyService
{
   private readonly IHttpContextAccessor _httpContextAccessor;

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

   public void DoSomething()
   {
       var httpContext = _httpContextAccessor.HttpContext;
       var endpoint = httpContext?.GetEndpoint();
       var actionDescriptor = endpoint?.Metadata.GetMetadata<ActionDescriptor>();
       // Use action descriptor metadata.
   }
}

影響を受ける API