route query attribute c# asp.net-web-api asp.net-web-api-routing

c# - query - Enrutamiento API web con múltiples parámetros.



web api rest c# (2)

Estoy intentando averiguar cómo realizar el enrutamiento para el siguiente controlador de API web:

public class MyController : ApiController { // POST api/MyController/GetAllRows/userName/tableName [HttpPost] public List<MyRows> GetAllRows(string userName, string tableName) { ... } // POST api/MyController/GetRowsOfType/userName/tableName/rowType [HttpPost] public List<MyRows> GetRowsOfType(string userName, string tableName, string rowType) { ... } }

En este momento, estoy usando este enrutamiento para las URL:

routes.MapHttpRoute("AllRows", "api/{controller}/{action}/{userName}/{tableName}", new { userName= UrlParameter.Optional, tableName = UrlParameter.Optional }); routes.MapHttpRoute("RowsByType", "api/{controller}/{action}/{userName}/{tableName}/{rowType}", new { userName= UrlParameter.Optional, tableName = UrlParameter.Optional, rowType= UrlParameter.Optional });

pero solo el primer método (con 2 parámetros) está funcionando en este momento. ¿Estoy en la línea correcta, o tengo el formato de URL o el enrutamiento completamente incorrecto? El enrutamiento me parece magia negra ...


El problema es que la api/MyController/GetRowsOfType/userName/tableName/rowType siempre coincidirá con la primera ruta, por lo que nunca se llega a la segunda.

RowsByType simple, registre su ruta RowsByType primero.


He visto que el WebApiConfig está " fuera de control" con cientos de rutas colocadas en él.

En su lugar yo personalmente prefiero enrutamiento de atributos

Lo estás confundiendo con POST y GET

[HttpPost] public List<MyRows> GetAllRows(string userName, string tableName) { ... }

HttpPost Y GetAllRows ?

¿Por qué no hacer esto?

[Route("GetAllRows/{user}/{table}")] public List<MyRows> GetAllRows(string userName, string tableName) { ... }

O cámbielo a Ruta ("PostAllRows" y PostRows, creo que realmente está realizando una solicitud GET, por lo que el código que muestro debería funcionar para usted). , pero el método en sí mismo, ese nombre PUEDE SER EL que desee, siempre que la persona que llama coincida con la URL en ROUTE, puede poner GetMyStuff para el método si realmente lo desea.

Actualizar:

De hecho, prefiero ser explicit con el tipo de HTTP methods Y prefiero hacer coincidir los parámetros de ruta con los parámetros de método

[HttpPost] [Route("api/lead/{vendorNumber}/{recordLocator}")] public IHttpActionResult GetLead(string vendorNumber, string recordLocator) { .... }

(el GetLead la ruta no necesita coincidir con el nombre del método GetLead pero querrá mantener los mismos nombres en los parámetros de ruta y en los parámetros del método, aunque puede cambiar el orden; por ejemplo, coloque recordLocator antes de vendorNumber incluso si la ruta es la opuesta Yo no hago eso, ya que por eso es más confuso verlo.

Bonificación: ahora también puede usar expresiones regulares en las rutas, ejemplo

[Route("api/utilities/{vendorId:int}/{utilityType:regex(^(?i)(Gas)|(Electric)$)}/{accountType:regex(^(?i)(Residential)|(Business)$)}")] public IHttpActionResult GetUtilityList(int vendorId, string utilityType, string accountType) {