当控制器没有属性时,如何定义WebAPI路由?

时间:2018-01-24 16:06:56

标签: c# asp.net-web-api-routing

我正在调试使用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

2 个答案:

答案 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()方法。