我正在调试使用WebAPI的其他代码。 WebApiConfig看起来像这样:
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/v2/{controller}/{id}",
defaults: new {id = RouteParameter.Optional});
被调用的服务方法如下所示:
public class DeviceController : ApiController
{
[HttpGet]
public IHttpActionResult Get(string id)
{
// do stuff here...
}
}
以上代码有效,并且在发出请求时正确调用控制器。但是,当控制器中不存在属性时,路由如何工作?
编辑1:
假设我创建了一个名为PlantController的新控制器:
public class PlantController : ApiController
{
[HttpGet]
public IHttpActionResult Get(string id)
{
// do stuff here...
}
}
当我像这样呼叫网络服务时:
api/v2/plant/test
未调用PlantController。但是,当我调用设备服务时,它可以工作:
api/v2/device/test
答案 0 :(得分:0)
ID是可选的。所以,如果你称之为路线之王:api/v2/device
,它将尝试使用此签名调用控制器操作:
public class DeviceController : ApiController
{
[HttpGet]
public IHttpActionResult Get()
{
// do stuff here...
}
}
此规则适用于所有 HTTP字词(Post,Put等...)
答案 1 :(得分:0)
http动词属性的一种用法是基于http动词的准过载。
想象一下这个功能。
public class DeviceController : ApiController
{
[HttpGet]
public IHttpActionResult Get(string id)
{
// do stuff here...
}
public IHttpActionResult Get()
{
// do stuff here...
}
}
在此示例中,当http请求类型为GET时,将调用Get的Get(字符串id)重载,所有非GET请求类型将路由到另一个Get()
方法。