我知道有很多(已回答)与基于属性的路由有关的问题,但我似乎找不到能够回答我特定情况的问题。
我有一个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设计似乎是一种嵌套路线。
答案 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
之类的操作。