visual tutorial studio net mvc asp c# asp.net-core

c# - tutorial - Error de ASP.NET Core "CreatedAtRoute"



asp.net core web api (1)

Dentro de mi aplicación ASP.NET Core tengo una acción de controlador como esta:

[HttpPost] public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber) { //...implementation removed var link = Url.Link("SubscriberLink", new { id = subscriber.ID }); return Created(link, null); }

El código anterior funciona como se espera. Sin embargo, si uso el método incorporado "CreatedAtRoute", obtengo una excepción:

[HttpPost] public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber) { //...implementation removed return CreatedAtRoute("SubscriberLink", new { id = subscriber.ID }); }

La excepción es:

System.InvalidOperationException: ninguna ruta coincide con los valores proporcionados.

La excepción hace que el servicio devuelva un código de estado 500.

Es la misma ruta en ambos casos, así que no sé por qué el primer ejemplo funciona correctamente y el segundo no.

Mi project.json contiene esto:

"frameworks": { "dnx46": { }, "dnxcore50": { } },

Por motivos de referencia, la ruta nombrada se compone de dos piezas. Primero está el prefijo del controlador:

[Route("api/[controller]")] public class SubscribersController : Controller { // ... }

La segunda es la acción GET, donde la ruta real "SubscriberLink" se llama:

[HttpGet("{id}", Name = "SubscriberLink")] [SwaggerResponse(HttpStatusCode.OK, Type = typeof(Subscriber))] public async Task<IActionResult> GetSubscriber(Guid id) { //...implementation removed... return Ok(subscriber); }

¿Pensamientos?


Respuesta corta

Está utilizando la sobrecarga incorrecta de CreatedAtRoute . Utilice la sobrecarga que toma tres argumentos en su lugar.

Ejemplo de trabajo

Por ejemplo, los siguientes trabajos en mi máquina.

[Route("api/[controller]")] public class SubscribersController : Controller { public IActionResult Index() { var subscriber = new { Id = Guid.NewGuid(), FirstName = "Shaun", LastName = "Luttin" }; // overload with three arguments return CreatedAtRoute( routeName: "SubscriberLink", routeValues: new { id = subscriber.Id }, value: subscriber); } [HttpGet("{id}", Name = "SubscriberLink")] public IActionResult GetSubscriber(Guid id) { var subscriber = new { Id = id, FirstName = "Shaun", LastName = "Luttin" }; return new JsonResult(subscriber); } }

Detalles

El resultado es una respuesta 201. El cuerpo de la respuesta contiene detalles de la entidad que creamos (el argumento del value ) y el encabezado de la ubicación de la respuesta contiene un URI para la entidad.

Hay tres sobrecargas para CreatedAtRoute .

CreatedAtRoute(object routeValues, object value) CreatedAtRoute(string routeName, object value) CreatedAtRoute(string routeName, object routeValues, object value)

Si queremos pasar el nombre de una ruta y los valores de la ruta, usamos la sobrecarga que toma tres argumentos. Si no queremos devolver detalles de la entidad que creamos, podemos pasar null para el tercer argumento,