IActionContextAccessor 和 ActionContextAccessor 已过时

IActionContextAccessorActionContextAccessor 已被标记为过时,诊断标识符为 ASPDEPR006。 随着终结点路由的引入,不再需要IActionContextAccessor,因为开发人员可以直接通过HttpContext.GetEndpoint()访问动作描述符和元数据信息。

已引入的版本

.NET 10 预览版 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 不再需要。 终结点路由基础结构提供了一种更简洁和直接的方式,通过 HttpContext.GetEndpoint() 访问终结点元数据,这与 ASP.NET Core 在终结点路由方向的体系结构演变保持一致。

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