2013-06-04 30 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

了它!

路線:

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)' - 否則你永遠不會得到一個ID傳入... –

+0

是的,我只是意識到我忘了一個想要的端點: POST/v1/invoices 所以我需要一個職位()和一個帖子(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:

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

和控制方法:

你也許有點通過使動作的URL部分本事

[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)on Controllers.Api.InvoicesController \ r \ nSystem.Net.Http.HttpResponseMessage Post(Int32)類型Controllers.Api。InvoicesController「, – NiX

+0

@NiX - 查看更新 –