【发布时间】:2018-11-17 15:52:36
【问题描述】:
属性路由可以与基于约定的路由相结合。到 定义基于约定的路由,调用 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 前缀,为什么我还需要在路由属性中显式添加 api 前缀
【问题讨论】:
-
因为它们在路由表中是完全独立的路由。您可以向控制器添加路由前缀以避免在操作 s 上重复它
标签: asp.net-web-api asp.net-web-api2 asp.net-web-api-routing