У меня есть следующий контроллер определен в проекте Web API:Asp маршрутизации чистый атрибут, POST и PUT не работает на детском ресурсе
[RoutePrefix("api/installations")]
public class InstallationsController : BaseController
{
// GET all
[Authorize]
[Route("")]
public async Task<IHttpActionResult> Get(){ /*...*/}
// GET single
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> GetInstallation(int id){ /*...*/}
//POST new
[Authorize]
[Route("")]
public async Task<IHttpActionResult> PostInstallation(ViewModels.Installation installation){ /*...*/}
//PUT update
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> PutInstallation(int id, ViewModels.Installation installation){ /*...*/}
// DELETE
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> DeleteInstallation(int id){ /*...*/}
[Authorize]
[Route("{id:int}/newimage")]
[HttpPut]
public async Task<IHttpActionResult> PutNewImageUri(int installationId){ /*...*/}
}
Все вышеперечисленное маршрутов работает, кроме последнего, где я в основном хочу сделать PUT (я тоже попробовал POST, не повезло) на «api/installation/1/newimage» и получить ссылку на загрузку двоичных данных в хранилище Blob. Моя проблема заключается в том, что любые POST или PUT (и, возможно, DELETE) на что-либо «после» поля «{id: int}» не будут работать. GET на самом деле работает отлично, так как у меня есть это в другой контроллер:
[RoutePrefix("api/customers")]
public class CustomersController : BaseController
// GET related items
[Authorize]
[Route("{id:int}/{subitem}")]
public async Task<IHttpActionResult> GetCustomerChild(int id, string subItem)
Это будет называться для запросов GET к «API/клиентов/1/anystring», и он работал, когда я только имел «/ установки» вместо «/ {subitem}» в качестве переменной. Изменение моего обработчика PUT на "{id: int}/{imageAction}" тоже не работает.
В моем классе WebApiConfig я только иметь следующего (не маршрутизации конвенции на основе):
config.MapHttpAttributeRoutes();
Из браузера я только получить этот ответ, на который я нашел несколько подобных вопросы, но нет решения который фиксирует мою проблему:
{
"message": "No HTTP resource was found that matches the request URI 'https://localhost:44370/api/installations/6/newimage'.",
"messageDetail": "No action was found on the controller 'Installations' that matches the request."
}
Я начал пытаться отлаживать с помощью кода из этого вопроса: get a list of attribute route templates asp.net webapi 2.2
Это выглядит как мой ро Функция ute/function отображает int список RouteEntries, но все же кажется, что он не соответствует моим запросам, и я не могу найти никаких хороших предложений о том, как я могу отлаживать это дальше. Любые указатели будут оценены!
это потому, что ваши действия содержит аргумент для 'installationId' но ваш маршрут настроен' id' так они надевают 't матч? –
О, боже, конечно .. И у меня была такая же проблема на другом контроллере раньше, и я, вероятно, тогда сделал ту же самую ошибку. Это мой первый вопрос в StackOverflow, могу ли я как-то пометить ваш комментарий как ответ, или просто удалить его, поскольку заголовок не имеет отношения к моей реальной проблеме? – Martin
Я добавил ответ с предложениями в случае, если пользователи снова наткнутся на это. –