Pregunta

Estoy usando enrutamiento de atributos para especificar mis rutas en un controlador que hereda de System.Web.Http.ApiController.Estoy teniendo un comportamiento extraño.Aquí hay un código de muestra:

[RoutePrefix("api/1/user")]
public class UserRestController : ApiController
{
    UserService userService = new UserService();

    [Route("{id}"), HttpGet]
    public UserDTO Get(string id)
    {
        var user = userService.GetUserById(id);

        return user;
    }
}

Eso funciona absolutamente como esperaba.Cuando visito ~/api/1/user/someId obtengo la información esperada.Cuando cambio para no incluir el '1' en el prefijo de ruta, aparece "No se encontró ningún recurso HTTP que coincida con el URI de solicitud 'baseUrl/api/user/someId'".

Tengo rutas mvc, rutas de API web y rutas de atributos registradas al iniciar la aplicación en este proyecto, pero creo que las rutas predeterminadas para este controlador serían ~/userrest/...así que no creo que registrarlos sea la causa de esto, pero podría estar equivocado.

Muestra de lo que quiero:

[RoutePrefix("api/user")]
public class UserRestController : ApiController
{
    UserService userService = new UserService();

    [Route("{id}"), HttpGet]
    public UserDTO Get(string id)
    {
        var user = userService.GetUserById(id);

        return user;
    }
}

Esperaría que ~/api/user/someId funcionara, sin embargo, aparece el error mencionado anteriormente ("No se encontró ningún recurso HTTP que coincida con el URI de solicitud 'baseUrl/api/user/someId'").

XML de error completo:

<Error> 
    <Message> 
        No HTTP resource was found that matches the request URI     
        'baseUrl/api/user/someId';. 
    </Message> 
    <MessageDetail> 
        No type was found that matches the controller named 'user'. 
    </MessageDetail> 
</Error>
¿Fue útil?

Solución

Según la descripción de su error, parece que ha registrado rutas convencionales antes de llamar a MapHttpAttributeRoutes.Por ejemplo, es posible que tengas una ruta como config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...).En este caso la solicitud como api/user/someid coincidiría con esta ruta y la API web estaría buscando un controlador de tipo UserController.Asegúrate de llamar MapHttpAttributeRoutes antes de esta ruta convencional.

Regla básica:Las rutas más específicas deben registrarse antes que las rutas menos específicas o genéricas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top