基于WebAPI2属性的路由404具有嵌套路由

时间:2015-07-16 12:54:43

标签: asp.net asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我知道有很多(已回答)与基于属性的路由有关的问题,但我似乎找不到能够回答我特定情况的问题。

我有一个WebAPI 2控制器,其中一些方法使用默认路由:

public Dictionary<int, SensorModel> Get()
{
    return SensorModel.List();
}

public SensorModel Get(int id)
{
    return SensorModel.Get(id);
}

[HttpPost]
public SensorModel Post(SensorModel model)
{
    if (model == null) throw new Exception("model cannot be null");
    if (model.Id <= 0) throw new Exception("Id must be set");
    return SensorModel.Update(model.Id, model);
}

这些都很好。我试图创建一个嵌套路由,如下所示:

[Route("sensor/{id}/suspend")]
public SensorModel Suspend(int id, DateTime restartAt, EnSite site)
{
    return SensorModel.Suspend(id, restartAt, site);
} 

我希望URL看起来像这样:

http://[application_root]/api/sensor/1/suspend?restartAt={someDateTime}&site={anInt}

抱歉,忘了说实际问题是404! 谁能告诉我我做错了什么?我知道我可以这样做:

[Route("sensor/suspend")]
public SensorModel Suspend(int id, DateTime restartAt, EnSite site)
{
    return SensorModel.Suspend(id, restartAt, site);
}

使URL成为:

http://[application_root]/api/sensor/suspend?id=1&restartAt={someDateTime}&site={anInt}

但我认为,更清晰的API设计似乎是一种嵌套路线。

1 个答案:

答案 0 :(得分:1)

你的假设在这一点上是错误的:

For which I would expect the URL to look like:

http://[application_root]/api/sensor/1/suspend?restartAt={someDateTime}&site={anInt}

应该如下所示:

http://[application_root]/sensor/1/suspend?id=1&restartAt={someDateTime}&site={anInt}

当您指定基于属性的路由时,它会覆盖../api/..的默认路由体系结构(或您在 route.config 文件中指定的任何内容)。

因此,每当您尝试使用基于属性的路由时,您应该执行/route_prefix_at_controller_level/route_prefix_at_method_level之类的操作。