Compartir a través de


IActionContextAccessor y ActionContextAccessor están obsoletos

IActionContextAccessor y ActionContextAccessor se han marcado como obsoletos con el identificador de diagnóstico ASPDEPR006. Con la introducción del enrutamiento de puntos de conexión, IActionContextAccessor ya no es necesario, ya que los desarrolladores pueden acceder a la información de metadatos y descriptores de acción directamente a través de HttpContext.GetEndpoint().

Versión introducida

.NET 10 Preview 7

Comportamiento anterior

Anteriormente, podría usar IActionContextAccessor para acceder al objeto actual 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.
   }
}

Nuevo comportamiento

A partir de .NET 10, el uso de IActionContextAccessor y ActionContextAccessor genera una advertencia del compilador con el identificador de diagnóstico ASPDEPR006:

advertencia ASPDEPR006: ActionContextAccessor está obsoleto y se quitará en una versión futura. Para más información, visite https://aka.ms/aspnet/deprecate/006.

Tipo de cambio disruptivo

Este cambio puede afectar a la compatibilidad de orígenes.

Motivo del cambio

Con la introducción del enrutamiento de puntos de conexión en ASP.NET Core, IActionContextAccessor ya no es necesario. La infraestructura de enrutamiento de puntos de conexión proporciona una manera más limpia y directa de acceder a los metadatos de los puntos de conexión a través de HttpContext.GetEndpoint(), alineándose con la evolución arquitectónica de ASP.NET Core, hacia el enrutamiento de puntos de conexión.

Migrar de IActionContextAccessor a IHttpContextAccessor y usar HttpContext.GetEndpoint():

Antes:

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
   }
}

Después:

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.
   }
}

Las APIs afectadas