solicitud recurso que ningún encontrado con coincida c# asp.net-web-api asp.net-web-api-routing

c# - no se ha encontrado ningún recurso http que coincida con la uri de la solicitud



Rutas de API web para admitir tanto ID de GUID como enteros (1)

¿Cómo puedo admitir rutas GET tanto para GUID como para enteros? Me doy cuenta de que los GUID no son ideales, pero es lo que es por ahora. Estoy deseando agregar compatibilidad con enteros para que a los usuarios les resulte más fácil recordar y comunicar lo que deberían ser "claves" únicas.

Ejemplo de rutas:

testcases/9D9A691A-AE95-45A4-A423-08DD1A69D0D1 testcases/1234

Mi WebApiConfig :

public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); var routes = config.Routes; routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}"); routes.MapHttpRoute("DefaultApiWithKey", "Api/{controller}/{key}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), key = @"^/d+$" }); routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }); routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }); routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }); }

Mi controlador (solo firmas de método):

[RoutePrefix("Api/TestCases")] public class TestCasesController : PlanControllerBase { [Route("")] public OperationResult<IEnumerable<TestCaseDTO>> Get([FromUri] TestCaseRequest request) [Route("{id}")] [HttpGet] public OperationResult<TestCaseDTO> Get(Guid id) [Route("{key}")] [HttpGet] public OperationResult<TestCaseDTO> Get(int key) ... }

Recibo un error interno del servidor cuando intento llamar al recurso utilizando el entero. Cualquier ayuda es apreciada!


Gracias a @SirwanAfifi! Me había topado con el artículo de enrutamiento de atributos en ASP.NET al que se hacía referencia en la pregunta SO que mencionó, pero al parecer no vi la necesidad de restricciones de atributos de ruta en ese momento.

Para mí, estaba usando [Route("{id:guid}")] y [Route("{key:int}")] en los métodos de mi controlador que hicieron el truco. También comenté las rutas Http relacionadas con {id} y {key} en mi WebApiConfig para verificar que los atributos en el controlador son responsables de hacer el enrutamiento.