属性路由可以与基于约定的路由相结合。至 定义基于约定的路由,调用MapHttpRoute方法。
我希望每条路线都以api
开头。例如,我希望路由为http://localhost:40000/api/client/{id}/batch/approve
,所以这是我的WebApiConfig类
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
然后在控制器中我有
public class BatchController : ApiController
{
private readonly MyService _service;
public BatchController(MyService service)
{
_service = service;
}
[HttpPost]
[Route("client/{id}/batch/approve")]
public async Task<IHttpActionResult> Approve(int id, RequestDTO request)
{
return Ok(await _service.Approve(clientID,request).ConfigureAwait(false));
}
当客户端调用此路由时,它会收到404 Not Found
响应。
但是,如果我在Route属性中加上api
,如下所示,那么它可以工作
[Route("api/client/{id}/batch/approve")]
为什么基于约定的路由没有为api
添加前缀,为什么我还需要在Route属性中明确添加api
前缀
答案 0 :(得分:0)
您必须为控制器设置RoutePrefixAttribute
:
[RoutePrefix("api")]
public class BatchController : ApiController
{
[HttpPost]
[Route("client/{id}/batch/approve")]
public async Task<IHttpActionResult> Approve(int id, RequestDTO request)
{
...
}
}