【问题标题】:web api combining attribute routing with convention-based routing does not work将属性路由与基于约定的路由相结合的 web api 不起作用
【发布时间】:2018-11-17 15:52:36
【问题描述】:

基于documentaion

属性路由可以与基于约定的路由相结合。到 定义基于约定的路由,调用 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


【解决方案1】:

您必须为控制器设置RoutePrefixAttribute

[RoutePrefix("api")] public class BatchController : ApiController { [HttpPost] [Route("client/{id}/batch/approve")] public async Task<IHttpActionResult> Approve(int id, RequestDTO request) { ... } }

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2014-02-12
    • 2017-11-20
    • 1970-01-01
    • 2013-11-11
    • 2017-09-19
    • 2016-07-13
    相关资源
    最近更新 更多