Web API路由操作

本文关键字:操作 路由 API Web | 更新日期: 2023-09-27 18:16:50

目标是允许这四个端点:

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变量后具有不同部分的端点?

Web API路由操作

明白了!

路线:

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中修复。净v5。

谢谢你的帮助!

我认为您必须定义另一个路由,因为第一个URI不应该匹配InvoiceAttachments路由,因为它在末尾没有"/attachments"

尝试使用单一路由

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)

您是否尝试过使用约束而不是默认值?

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

更新:

你可以通过将动作设置为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()