Подтвердить что ты не робот

Ошибка ASP.NET Core "CreatedAtRoute"

Внутри моего приложения ASP.NET Core у меня есть действие контроллера следующим образом:

[HttpPost]
public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber)
{
    //...implementation removed

    var link = Url.Link("SubscriberLink", new { id = subscriber.ID });
        return Created(link, null);
}

Вышеприведенный код работает так, как ожидалось. Однако, если я использую встроенный метод "CreatedAtRoute", то получаю исключение:

[HttpPost]
public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber)
{
    //...implementation removed

    return CreatedAtRoute("SubscriberLink", new { id = subscriber.ID });
}

Исключение составляет:

System.InvalidOperationException: маршрут не соответствует указанным значениям.

Исключение приводит к тому, что служба возвращает код состояния 500.

Это один и тот же маршрут в любом случае, поэтому я не знаю, почему первый пример работает правильно, а второй - нет.

My project.json содержит следующее:

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

Для справки, названный маршрут состоит из двух частей. Первый - это префикс контроллера:

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

Во-вторых, это действие GET, где фактический маршрут "SubscriberLink" назван:

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

Мысли?

4b9b3361

Ответ 1

Короткий ответ

Вы используете неправильную перегрузку CreatedAtRoute. Используйте перегрузку, которая принимает три аргумента.

Рабочий пример

Например, на моей машине работает следующее.

[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);
    }
}

Подробнее

Результат - ответ 201. Тело ответа содержит сведения об объекте, который мы создали (аргумент value), а заголовок ответа ответа содержит URI для объекта.

Ответ включает созданный объект и его местоположение.

Существует три перегрузки для CreatedAtRoute.

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

Если мы хотим передать имя маршрута и значения маршрута, мы используем перегрузку, которая принимает три аргумента. Если мы не хотим возвращать детали созданного нами объекта, мы можем передать null для третьего аргумента,