varias solicitud route que parameter net multiple maphttproute maphttpattributeroutes httpget encontraron con coincidían asp acciones c# asp.net-web-api asp.net-web-api-routing

c# - solicitud - web api 2 route config



Enrutamiento con múltiples métodos Get en ASP.NET Web API (10)

También especificará la ruta en la acción para establecer la ruta

[HttpGet] [Route("api/customers/")] public List<Customer> Get() { //gets all customer logic } [HttpGet] [Route("api/customers/currentMonth")] public List<Customer> GetCustomerByCurrentMonth() { //gets some customer } [HttpGet] [Route("api/customers/{id}")] public Customer GetCustomerById(string id) { //gets a single customer by specified id } [HttpGet] [Route("api/customers/customerByUsername/{username}")] public Customer GetCustomerByUsername(string username) { //gets customer by its username }

Estoy utilizando Web Api con ASP.NET MVC, y soy muy nuevo en esto. He pasado por una demo en el sitio web asp.net y estoy tratando de hacer lo siguiente.

Tengo 4 métodos de obtención, con las siguientes firmas

public List<Customer> Get() { // gets all customer } public List<Customer> GetCustomerByCurrentMonth() { // gets some customer on some logic } public Customer GetCustomerById(string id) { // gets a single customer using id } public Customer GetCustomerByUsername(string username) { // gets a single customer using username }

Para todos los métodos anteriores me gustaría tener mi api web algo así como se muestra a continuación

  • List Get () = api/customers/
  • Cliente GetCustomerById (Id cadena) = api/customers/13
  • Lista GetCustomerByCurrentMonth () = /customers/currentMonth
  • Cliente GetCustomerByUsername (string username) = /customers/customerByUsername/yasser

Traté de hacer cambios en el enrutamiento, pero como soy nuevo en él, no pude entender mucho.

Entonces, por favor, ¿alguien puede ayudarme a entender y guiarme sobre cómo se debe hacer esto? Gracias


Desde aquí Enrutamiento en Asp.net Mvc 4 y Web Api

Darin Dimitrov ha publicado una muy buena respuesta que está funcionando para mí.

Dice...

Podrías tener un par de rutas:

public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "ApiById", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { id = @"^[0-9]+$" } ); config.Routes.MapHttpRoute( name: "ApiByName", routeTemplate: "api/{controller}/{action}/{name}", defaults: null, constraints: new { name = @"^[a-z]+$" } ); config.Routes.MapHttpRoute( name: "ApiByAction", routeTemplate: "api/{controller}/{action}", defaults: new { action = "Get" } ); } }


Después de leer muchas respuestas finalmente me di cuenta.

Primero, agregué 3 rutas diferentes en WebApiConfig.cs

public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "ApiById", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { id = @"^[0-9]+$" } ); config.Routes.MapHttpRoute( name: "ApiByName", routeTemplate: "api/{controller}/{action}/{name}", defaults: null, constraints: new { name = @"^[a-z]+$" } ); config.Routes.MapHttpRoute( name: "ApiByAction", routeTemplate: "api/{controller}/{action}", defaults: new { action = "Get" } ); }

Luego, se eliminó ActionName, Route, etc. de las funciones del controlador. Así que, básicamente, este es mi controlador;

// GET: api/Countries/5 [ResponseType(typeof(Countries))] //[ActionName("CountryById")] public async Task<IHttpActionResult> GetCountries(int id) { Countries countries = await db.Countries.FindAsync(id); if (countries == null) { return NotFound(); } return Ok(countries); } // GET: api/Countries/tur //[ResponseType(typeof(Countries))] ////[Route("api/CountriesByName/{anyString}")] ////[ActionName("CountriesByName")] //[HttpGet] [ResponseType(typeof(Countries))] //[ActionName("CountryByName")] public async Task<IHttpActionResult> GetCountriesByName(string name) { var countries = await db.Countries .Where(s=>s.Country.ToString().StartsWith(name)) .ToListAsync(); if (countries == null) { return NotFound(); } return Ok(countries); }

Ahora puedo ejecutar con las siguientes muestras de URL (con nombre y con id);

http://localhost:49787/api/Countries/GetCountriesByName/France

http://localhost:49787/api/Countries/1


Es posible que no necesite hacer ningún cambio en el enrutamiento. Simplemente agregue los siguientes cuatro métodos en su archivo customersController.cs:

public ActionResult Index() { } public ActionResult currentMonth() { } public ActionResult customerById(int id) { } public ActionResult customerByUsername(string userName) { }

Pon el código relevante en el método. Con el enrutamiento predeterminado suministrado, debe obtener el resultado de acción apropiado del controlador en función de la acción y los parámetros para sus direcciones URL.

Modifique su ruta predeterminada como:

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Api", action = "Index", id = UrlParameter.Optional } // Parameter defaults );


Primero, agrega una nueva ruta con acción en la parte superior:

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

Luego use el atributo ActionName para mapear:

[HttpGet] public List<Customer> Get() { //gets all customer } [ActionName("CurrentMonth")] public List<Customer> GetCustomerByCurrentMonth() { //gets some customer on some logic } [ActionName("customerById")] public Customer GetCustomerById(string id) { //gets a single customer using id } [ActionName("customerByUsername")] public Customer GetCustomerByUsername(string username) { //gets a single customer using username }


Solo una ruta suficiente para esto

config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");

Y necesita especificar el atributo HttpGet o HttpPost en todas las acciones.

[HttpGet] public IEnumerable<object> TestGet1() { return new string[] { "value1", "value2" }; } [HttpGet] public IEnumerable<object> TestGet2() { return new string[] { "value3", "value4" }; }


Tengo dos métodos para obtener el mismo parámetro o ninguno

[Route("api/ControllerName/FirstList")] [HttpGet] public IHttpActionResult FirstList() { } [Route("api/ControllerName/SecondList")] [HttpGet] public IHttpActionResult SecondList() { }

Simplemente defina las rutas personalizadas en AppStart=>WebApiConfig.cs => en el método de registro

config.Routes.MapHttpRoute( name: "GetFirstList", routeTemplate: "api/Controllername/FirstList" ); config.Routes.MapHttpRoute( name: "GetSecondList", routeTemplate: "api/Controllername/SecondList" );


Ya hay muchas buenas respuestas para esta pregunta. Sin embargo, hoy en día, la configuración de la ruta está "en desuso". La versión más reciente de MVC (.NET Core) no es compatible. Así que es mejor acostumbrarse :)

Así que estoy de acuerdo con todas las respuestas que usan el enrutamiento de estilo de atributo. Pero sigo notando que todos repitieron la parte básica de la ruta (api / ...). Es mejor aplicar un atributo [RoutePrefix] encima de la clase Controller y no repetir la misma cadena una y otra vez.

[RoutePrefix("api/customers")] public class MyController : Controller { [HttpGet] public List<Customer> Get() { //gets all customer logic } [HttpGet] [Route("currentMonth")] public List<Customer> GetCustomerByCurrentMonth() { //gets some customer } [HttpGet] [Route("{id}")] public Customer GetCustomerById(string id) { //gets a single customer by specified id } [HttpGet] [Route("customerByUsername/{username}")] public Customer GetCustomerByUsername(string username) { //gets customer by its username } }


// this piece of code in the WebApiConfig.cs file or your custom bootstrap application class // define two types of routes 1. DefaultActionApi and 2. DefaultApi as below config.Routes.MapHttpRoute("DefaultActionApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }); config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { action = "Default", id = RouteParameter.Optional }); // decorate the controller action method with [ActionName("Default")] which need to invoked with below url // http://localhost:XXXXX/api/Demo/ -- will invoke the Get method of Demo controller // http://localhost:XXXXX/api/Demo/GetAll -- will invoke the GetAll method of Demo controller // http://localhost:XXXXX/api/Demo/GetById -- will invoke the GetById method of Demo controller // http://localhost:57870/api/Demo/CustomGetDetails -- will invoke the CustomGetDetails method of Demo controller // http://localhost:57870/api/Demo/DemoGet -- will invoke the DemoGet method of Demo controller public class DemoController : ApiController { // Mark the method with ActionName attribute (defined in MapRoutes) [ActionName("Default")] public HttpResponseMessage Get() { return Request.CreateResponse(HttpStatusCode.OK, "Get Method"); } public HttpResponseMessage GetAll() { return Request.CreateResponse(HttpStatusCode.OK, "GetAll Method"); } public HttpResponseMessage GetById() { return Request.CreateResponse(HttpStatusCode.OK, "Getby Id Method"); } //Custom Method name [HttpGet] public HttpResponseMessage DemoGet() { return Request.CreateResponse(HttpStatusCode.OK, "DemoGet Method"); } //Custom Method name [HttpGet] public HttpResponseMessage CustomGetDetails() { return Request.CreateResponse(HttpStatusCode.OK, "CustomGetDetails Method"); } }


using Routing.Models; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace Routing.Controllers { public class StudentsController : ApiController { static List<Students> Lststudents = new List<Students>() { new Students { id=1, name="kim" }, new Students { id=2, name="aman" }, new Students { id=3, name="shikha" }, new Students { id=4, name="ria" } }; [HttpGet] public IEnumerable<Students> getlist() { return Lststudents; } [HttpGet] public Students getcurrentstudent(int id) { return Lststudents.FirstOrDefault(e => e.id == id); } [HttpGet] [Route("api/Students/{id}/course")] public IEnumerable<string> getcurrentCourse(int id) { if (id == 1) return new List<string>() { "emgili", "hindi", "pun" }; if (id == 2) return new List<string>() { "math" }; if (id == 3) return new List<string>() { "c#", "webapi" }; else return new List<string>() { }; } [HttpGet] [Route("api/students/{id}/{name}")] public IEnumerable<Students> getlist(int id, string name) { return Lststudents.Where(e => e.id == id && e.name == name).ToList(); } [HttpGet] public IEnumerable<string> getlistcourse(int id, string name) { if (id == 1 && name == "kim") return new List<string>() { "emgili", "hindi", "pun" }; if (id == 2 && name == "aman") return new List<string>() { "math" }; else return new List<string>() { "no data" }; } } }