2013-06-04 31 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 - 查看更新 –