Estoy creando asp.net webapi con dos métodos get. Uno devuelve todos los registros, mientras que el otro debe ser filtrado basado en un parámetro de cadena llamado código del país. No estoy seguro de por qué razón el método get con el parámetro de cadena no se invoca.

He intentado de la siguiente uri

http://localhost:64389/api/team/'GB'
http://localhost:64389/api/team/GB

Siguiente es mi código

Web API

public HttpResponseMessage Get()
        {
            var teams = _teamServices.GetTeam();
            if (teams != null)
            {
                var teamEntities = teams as List<TeamDto> ?? teams.ToList();
                if (teamEntities.Any())
                    return Request.CreateResponse(HttpStatusCode.OK, teamEntities);
            }
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Team not found");

        }

        public HttpResponseMessage Get(string countryCode)
        {
            if (countryCode != null)
            {

                var team = _teamServices.GetTeamById(countryCode);
                if (team != null)
                    return Request.CreateResponse(HttpStatusCode.OK, team);
            }

            throw new Exception();
        }

WebAPIConfig

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //Web API configuration and services
            //Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            //Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Formatters.JsonFormatter.SupportedMediaTypes
            .Add(new MediaTypeHeaderValue("text/html"));
        }
    }
InformationsquelleAutor Tom | 2017-03-13

1 Comentario

  1. 15

    Creo que probablemente golpear el default ‘Get()’ método del predeterminada de la API de ruta.

    Espero que si ha cambiado el nombre del parámetro a ‘id’ en su método como tal, también el trabajo:

    public HttpResponseMessage Get(string id)
    

    Esto es debido a que el parámetro opcional nombre en la ruta por defecto es ‘id’.

    Para el atributo de enrutamiento para el trabajo, usted necesita para decorar su controlador y los métodos con los valores que anteriormente se infiere por la ruta de configuración.

    Así que en la parte superior de su controlador, probablemente habría:

    [RoutePrefix("api/team")]
    public class TeamController : ApiController
    

    Y luego por encima de su segundo método get:

    [Route("{countryCode}")]
    public HttpResponseMessage Get(string countryCode)
    

    Desde el atributo de enrutamiento, no he usado el «viejo estilo» de enrutamiento.

    Retirar el ASP.NET página sobre el atributo de enrutamiento para obtener más información.

    Editar comentarios:

    Si usted tiene dos rutas que tienen los mismos parámetros que necesita para diferenciarlos de alguna manera en la ruta. Así, por su ejemplo de obtener por el nombre del equipo, probablemente voy a hacer algo como esto:

    [HttpGet()]
    [Route("byTeamName/{teamName}")]
    public HttpResponseMessage GetByTeamName(string teamName)
    
    Your url would then be /api/team/byTeamName/...
    

    Su otro nombre del método es «Get» y el HTTP por defecto del atributo de enrutamiento busca los nombres de método con el mismo verbos HTTP. Sin embargo, usted puede nombrar a su métodos de algo que le guste y decorar con los verbos en su lugar.

    • Hola Craig, ¿qué pasa si tengo otro método como [Ruta(«{nombre_de_equipo}»)] public HttpResponseMessage GetTeamName(cadena nombre_de_equipo). ¿Cómo será mi ruta defferenciate la solicitud Get como tomar parámetro de cadena
    • Hola Tom, he añadido un poco para el final de la respuesta. Espero que esto ayude.
    • Usted es el hombre… un millón de gracias. «Esto es debido a que el parámetro opcional nombre en la ruta por defecto es ‘id’.» Esta línea salvó mi vida… me lo hizo todo bien, pero se me olvidó cambiar el nombre de id de segmento variable a la que yo estaba usando. Gracias mucho de nuevo….

Dejar respuesta

Please enter your comment!
Please enter your name here