route httpget ejemplo custom c# asp.net-web-api

c# - httpget - Parámetros de Web.API MapHttpRoute



web api rest c# (3)

Desde http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

También puede proporcionar restricciones, que restringen la forma en que un segmento URI puede coincidir con un marcador de posición:

restricciones: nuevo {id = @ "/ d +"} // Solo concuerda si "id" tiene uno o más dígitos.

Agregar esta restricción a "MethodOne" (api / {controller} / {action} / {id} / {type}) significaría que los números solo coinciden si {id} es un número, de lo contrario coincidiría con "MethodTwo" ("api / {controlador} / {acción} / {directorio} / {informe} ").

Estoy teniendo problemas con mi enrutamiento Web.API. Tengo las siguientes dos rutas:

config.Routes.MapHttpRoute( name: "MethodOne", routeTemplate: "api/{controller}/{action}/{id}/{type}", defaults: new { id = RouteParameter.Optional, type = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: "MethodTwo", routeTemplate: "api/{controller}/{action}/{directory}/{report}", defaults: new { directory = RouteParameter.Optional, report = RouteParameter.Optional } );

Y en mi controlador estos dos métodos:

[HttpGet] [ActionName("methodone")] public string MethodOne(string id, string type) { return string.Empty; } [HttpGet] [ActionName("methodtwo")] public string MethodTwo(string directory, string report) { return string.Empty; }

Estos dos aparentemente no pueden vivir uno al lado del otro. Si comento la ruta de MethodOne en WebApiConfig, la ruta de MethodTwo funciona. Comentando MethodTwo route permite que MethodOne funcione. Dejando ambos sin comentarios, MethodOne funciona, pero no MethodTwo.

Esperaba usar una ruta para ambos, entonces parece que tendrían que tener los mismos nombres de parámetros. ¿Quién escribe métodos con nombres de parámetros genéricos? Malo. Realmente no quiero que mis métodos tengan los mismos nombres de parámetros (como p1, p2, p3), así que pensé que podía crear una ruta solo para el nuevo método. Pero incluso esto no parece funcionar.

Realmente extraño el WebGet(UriTemplate="") del resto de WCF.

Tengo un controlador que tiene muchos métodos, algunos con 1, 2, 3 o incluso más parámetros. No puedo creer que no pueda usar nombres de parámetros significativos con el enfoque MapHttpRoute.

Podría comentar esas cosas por completo y usar WebGet() ... pero antes de llegar quería ver si me estaba perdiendo algo.


La razón por la que está viendo este problema es porque su primera ruta coincidirá con ambas solicitudes. El identificador y el token de tipo en la URL coincidirán con ambas solicitudes porque cuando se esté ejecutando la ruta, intentará analizar la URL y asociará cada segmento con su URL.

Por lo tanto, su primera ruta coincidirá con ambas solicitudes de la siguiente manera.

~/methodone/1/mytype => action = methodone, id = 1, and type = mytype ~/methodtwo/directory/report => action = methodtwo, id = directory, and type = report

Para evitar esto, debe utilizar la ruta como

config.Routes.MapHttpRoute( name: "MethodOne", routeTemplate: "api/{controller}/methodone/{id}/{type}", defaults: new { id = RouteParameter.Optional, type = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: "MethodTwo", routeTemplate: "api/{controller}/methodtwo/{directory}/{report}", defaults: new { directory = RouteParameter.Optional, report = RouteParameter.Optional } );

Incluso si utiliza WebGet, es posible que deba hacer algo similar para desambiguar esos dos métodos que creo.