2017-01-18 1 views
1

У меня есть следующий контроллер определен в проекте 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, но все же кажется, что он не соответствует моим запросам, и я не могу найти никаких хороших предложений о том, как я могу отлаживать это дальше. Любые указатели будут оценены!

+1

это потому, что ваши действия содержит аргумент для 'installationId' но ваш маршрут настроен' id' так они надевают 't матч? –

+0

О, боже, конечно .. И у меня была такая же проблема на другом контроллере раньше, и я, вероятно, тогда сделал ту же самую ошибку. Это мой первый вопрос в StackOverflow, могу ли я как-то пометить ваш комментарий как ответ, или просто удалить его, поскольку заголовок не имеет отношения к моей реальной проблеме? – Martin

+0

Я добавил ответ с предложениями в случае, если пользователи снова наткнутся на это. –

ответ

0

Это потому, что ваше действие содержит аргумент для installationId, но ваш маршрут настроен с id, чтобы они не совпадали.

Либо изменить маршрут:

[Route("{installationId:int}/newimage")] 

или подпись:

public async Task<IHttpActionResult> PutNewImageUri(int id){ /*...*/} 
+0

Большое спасибо, я не понимал, что имена параметров должны совпадать, думал только о порядке и/или типах. Теперь он отлично работает! – Martin

Смежные вопросы