2013-06-04 4 views
3

Цель состоит в том, чтобы эти четыре конечные точки:Web API действия маршрутизации

POST v1/invoices<br/> 
POST v1/invoices/12345<br/> 
POST v1/invoices/12345/attachment<br/> 
POST v1/invoices/12345/image 

маршрутизации записей:

routes.MapHttpRoute(
     name: "InvoiceAttachments", 
     routeTemplate: "v1/invoices/{id}/attachments", 
     defaults: new { controller = "invoices", action = "PostAttachment" } 
    ); 

routes.MapHttpRoute(
     name: "InvoiceImages", 
     routeTemplate: "v1/invoices/{id}/images", 
     defaults: new { controller = "invoices", action = "PostImage" } 
    ); 

Это мои четыре определения функции в контроллере:

[HttpPost] 
[ActionName("PostAttachment")] 
public HttpResponseMessage PostAttachment(int id) 

[HttpPost] 
[ActionName("PostImage")] 
public HttpResponseMessage PostImage(int id) 

[HttpPost] 
public HttpResponseMessage Post(int id)  

[HttpPost] 
public HttpResponseMessage Post() 

Однако, когда я отправляю счет-фактуру с использованием первого URI, маршрут, который распознается, является маршрутом вложений. Как у меня есть конечные точки с разными разделами после переменной ID?

ответ

7

Got Это!

Маршрут: определения

routes.MapHttpRoute(
     name: "InvoiceStuff", 
     routeTemplate: "v1/invoices/{id}/{*action}", 
     defaults: new { controller = "invoices", action = "" } 
    ); 

Функция:

[HttpPost] 
[ActionName("Attachments")] 
public HttpResponseMessage Attachments([FromUri]int id) 

[HttpPost] 
[ActionName("Images")] 
public HttpResponseMessage Images([FromUri]int id) 

[HttpPost] 
public HttpResponseMessage Post() 

[HttpPost] 
[ActionName("")] 
public HttpResponseMessage Post([FromUri]int id) 

отлично работает. Обратите внимание, что в маршруте я указал действие по умолчанию «» из-за дефекта в маршрутизации webAPI с помощью подстановочных знаков. Если бы я не выполнил значение по умолчанию, было бы выбрано исключение нулевой ссылки. Более подробную информацию о дефекте можно найти здесь: http://aspnetwebstack.codeplex.com/workitem/718 - планируется установить в ASP.NET v5.

Спасибо за вашу помощь!

1

Я думаю, вы должны иметь другой маршрут, определенный, потому что первый URI не должен быть соответствующий маршрут InvoiceAttachments, потому что он не имеет «/ вложения» на конце

0

Попробуйте имеющие один маршрут

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}/{action}", 
    defaults: new { id = RouteParameter.Optional, action = "DefaultAction" } 
); 

Тогда украсьте функции, такие как

[HttpPost] 
[ActionName("DefaultAction")] 
public HttpResponseMessage Post() 


[HttpPost] 
public HttpResponseMessage PostImage(int id) 
+0

Это не работает, когда я делаю/invoices/12345, он переходит к действию по умолчанию без переданного параметра id.:/ – NiX

+0

@NiX - вы пытались изменить вышеуказанный DefaultAction, чтобы принять аргумент int id? 'Post (int id)' - в противном случае вы никогда не получите идентификатор, переданный в ... –

+0

Да, и я только что понял, что забыл одну из нужных конечных точек: POST/v1/invoices поэтому мне нужно сообщение() и post (int id) – NiX

0

вы пытались использовать ограничение, а не по умолчанию?

routes.MapHttpRoute(
     name: "InvoiceAttachments", 
     routeTemplate: "v1/invoices/{id}/attachments", 
     defaults: new { controller = "invoices" }, 
     constraints: new { action = "PostAttachment" } 
    ); 

routes.MapHttpRoute(
     name: "InvoiceImages", 
     routeTemplate: "v1/invoices/{id}/images", 
     defaults: new { controller = "invoices" }, 
     constraints: new { action = "PostImage" } 
    ); 

routes.MapHttpRoute(
     name: "Default", 
     routeTemplate: "v1/invoices/{id}", 
     defaults: new { controller = "invoices" } 
    ); 

UPDATE:

Вы могли бы, вероятно, своего рода взломать его, сделав действие URL, часть:

routes.MapHttpRoute(
     name: "InvoiceAttachments", 
     routeTemplate: "v1/invoices/{id}/{action}", 
     defaults: new { controller = "invoices" }, 
     constraints: new {action = "attachments|images"} 
    ); 

routes.MapHttpRoute(
      name: "default", 
      routeTemplate: "v1/invoices/{id}", 
      defaults: new { controller = "invoices", id = RouteParameter.Optional }, 
      constraints: new {action = "attachments|images"} 
     ); 

и методы контроллера:

[HttpPost] 
[ActionName("attachments")] 
public HttpResponseMessage PostAttachment(int id) 

[HttpPost] 
[ActionName("images")] 
public HttpResponseMessage PostImage(int id) 

public HttpResponseMessage Post(int id) 

public HttpResponseMessage Post() 
+0

Пробовал это и получил это исключение: «Было найдено несколько действий, соответствующих запросу: \ r \ nSystem.Net.Http.HttpResponseMessage PostAttachment (Int32) для типов контроллеров.Api.InvoicesController \ r \ nSystem.Net.Http.HttpResponseMessage Post (Int32) для типов Controllers.Api.InvoicesController ", – NiX

+0

@NiX - см. Обновление –