2016-07-25 8 views
0

У меня есть проект веб-API, который использует маршрут по умолчанию «api/{controller}/{id}», где «id» является необязательным. В большинстве случаев этого достаточно, но в некоторых случаях мне нужна маршрутизация атрибутов. В этом конкретном случае у меня есть «api/Customers/{customerID}/Orders/{orderID}», где требуется идентификатор клиента, а orderID - необязательный. Первоначально мой код требовал только идентификатор заказа, но мне нужен способ вытащить заказы для конкретного клиента, поэтому я использовал маршрут атрибута для своих методов, чтобы это разрешить.Не удается использовать POST для конечной точки веб-API с использованием маршрутизации атрибутов

Я могу выполнить операции GET без проблем, но когда я пытаюсь выполнить операцию POST, я получаю ошибку 500. Что странно, но мой объект создается, поэтому возникшее исключение должно появляться после создания вставки базы данных, но я не могу подтвердить это, так как мой отладчик не работает. Мой API находится в отдельном проекте из моего пользовательского интерфейса и по какой-то причине я не могу заставить отладчик работать в проекте API, поэтому установленные мною точки останова не работают.

Последняя строка кода в моем методе POST это:

return CreatedAtRoute("DefaultApi", new { id = order.ID }, order); 

Первый аргумент этого метода является название маршрута и один перечисленных выше для маршрута по умолчанию, заданный в WebApiConfig.cs. Этот конкретный маршрут, однако, отличается от значения по умолчанию:

[Route("api/Customers/{customerID:int}/Orders")] 

Возможно, это проблема? Поскольку этот маршрут использует два аргумента, я бы предположил, что мне нужно будет указать их в аргументе routeValues ​​(второй) для метода CreatedAtRoute.

Что мне нужно сделать, чтобы сделать эту работу? Я подозреваю, что у меня могут быть проблемы с выполнением операций PUT и DELETE, но мне нужно создать объект, прежде чем я смогу его изменить или удалить.

ответ

0

Хорошо, я решил это сам. Мне нужно установить атрибут Name на маршруте и использовать его как первый аргумент для CreateAtRouteMethod. Мне просто нужно было указать два значения маршрута, соответствующие двум аргументам метода. Я также мог выполнять операции PUT и DELETE без проблем.

[Route("api/Customers/{customerID:int}/Orders", Name = "Test")] 

return CreatedAtRoute("Test", new { customerID = customer.customerID, orderID = order.ID }, order);