WebApi 2.1路由在获得“;链接”;

本文关键字:链接 路由 WebApi | 更新日期: 2023-09-27 18:19:58

开始吧,

我配置了以下路线:

config.Routes.MapHttpRoute(
            name: "BatchLogs",
            routeTemplate: "api/Batches/{batchid}/Logs/{id}",
            defaults: new { controller = "BatchLogs", id = RouteParameter.Optional }
        );

我在BatchLogsController上的方法签名如下:

public async Task<IHttpActionResult> Get(int batchId, int id)

我得到这样的链接(例如:BatchId=7):

_urlHelper.Link("BatchLogs", new {batchId = batch.BatchId})

我的预期结果是:

http://localhost:19828/api/Batches/7/Logs/

但我得到了:

http://localhost:19828/api/Batches/7/Logs/7

为什么会发生这种情况,我应该如何解决?

提前谢谢。

WebApi 2.1路由在获得“;链接”;

生成链接时,Web API会尝试将您显式提供的值与作为当前请求路由数据一部分的任何值进行组合。

因此,例如,在这种情况下,您的Get操作可能被选择为值batchId = 7id = 7,这就是您看到以下链接的原因:http://localhost:19828/api/Batches/7/Logs/7

你可能想知道为什么要提供这种支持,但在某些情况下它确实很有帮助。Exmaple:假设你的控制器的Post操作被选中,你只想生成到同一控制器上另一个操作的链接(例如:Get(int id)),所以在这种情况下,你可以说_urlHelper.Link("DefaultApi", new {id = 10})。。。因此,这样就不需要再次指定controller值。

要强制丢弃当前请求的路由值,您需要显式地将其无效。

示例:_urlHelper.Link("BatchLogs", new {batchId = batch.BatchId, id = ""})