Web API, сочетающий маршрутизацию атрибутов с маршрутизацией на основе соглашений, не работает - PullRequest
0 голосов
/ 07 июня 2018

На основе документирования

Маршрутизация атрибута может сочетаться с маршрутизацией на основе соглашения.Чтобы определить основанные на соглашении маршруты, вызовите метод 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 ответ.Однако, если я префикс api в атрибуте Route, как показано ниже, это сработало

    [Route("api/client/{id}/batch/approve")]

Почему маршрутизация на основе соглашения не префикс api для маршрутизации, почему мне также необходимо явно добавить префикс api в атрибут Route

1 Ответ

0 голосов
/ 23 июля 2018

Вы должны установить 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

...