• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

198
Vistas
Versionado de API sin código duplicado en C#

Tengo una situación en la que agrego el control de versiones a una API, por lo que cambian las rutas a algunas funciones de la API. También cambié algunos métodos de POST a GET porque tenía más sentido.

Me gustaría desaprobar las rutas antiguas para que la gente empiece a usar las nuevas. Quiero que las rutas antiguas estén vinculadas a la v1 de mi API y las nuevas a la v2. Conseguí que esto funcionara duplicando todas las funciones y etiquetándolas con la ruta, el método y la versión de API correctos, pero esperaba una solución más limpia.

Mi ejemplo de 'limpiador' a continuación obviamente no funciona, ya que obtienes 4 funciones en este caso, todas obsoletas.

Usted obtiene:

  1. HTTPGET /canales
  2. HTTPPOST /canales
  3. HTTPGET /api/v2/canales/get
  4. HTTPPOST /api/v2/canales/get
 /// <summary> /// Gets a list of all channels /// </summary> /// <returns>List of all channels</returns> [HttpPost, Route("~/channels"), ApiVersion("1.0"), Obsolete("Obsolete, please use /api/v2/channels/get")] [HttpGet, Route("Get"), ApiVersion("2.0")] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannels() { return await _context.Monitors.ToListAsync(); }

¿Hay alguna manera de que pueda hacer que esto funcione?

almost 3 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Podría hacer dos funciones separadas que actúen como "puntos de acceso" a la lógica interna de la API. Uno de ellos podría marcarse como Obsoleto y usar las rutas antiguas y el otro usaría las rutas nuevas. Luego, podría crear una tercera función que contenga la lógica real de su API.

 // The obsolete access point [HttpPost, Obsolete("Obsolete, please use /api/v2/channels/get"), ApiVersion("1.0")] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannelsOld() { return await GetChannelsLogic(); } // The new access point [HttpGet, ApiVersion("2.0")] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannelsNew() { return await GetChannelsLogic(); } //Marked as NonAction so the method can't be accessed by a request. This is not necessary depending on the setup of your project. [NonAction] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannelsLogic() { // Perform some other logic return await _context.Monitors.ToListAsync(); }
almost 3 years ago · Santiago Trujillo Denunciar

0

Tratar de usar

 [HttpPost("~/channels"), ApiVersion("1.0"), Obsolete("Obsolete, please use /api/v2/channels/get")] [HttpGet("Get"), ApiVersion("2.0")] public async Task<ActionResult<IEnumerable<string>>> GetChannels() { return new List<string>(); }

para que solo puedas tener dos rutas

  1. HTTPPOST /canales
  2. HTTPGET /api/v2/canales/get
almost 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda