Какой маршрут мне добавить на карту к контроллеру API? - PullRequest
0 голосов
/ 28 сентября 2019

Я добавил ApiController в мое приложение asp.net core 2.2, и асинхронные вызовы из пользовательского интерфейса не совпадают.

Вот мои маршруты в Startup.cs.

app.UseMvc(config =>
{
    config.MapRoute(
        "Api",
        "api/{controller}/{action}/{id?}"
    );

    config.MapRoute(
        "Default", 
        "{controller=App}/{action=Index}/{id?}"
    );
});

Вот одна из функций javascript, которая выполняет различные запросы GET к контроллеру API.

function clearAllFilters() {
  $.get({
    url: "/api/GridFilter/ClearAllFilters",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function () {
        console.log('filters cleared');
    }
  });
}

Вот API-контроллер:

[Route("api/[controller]")]
[ApiController]
public class GridFilterController : ControllerBase
{
    private static readonly string[] FilterFields = {
        // Bunch of strings, omitted for brevity
    };

    [HttpGet]
    public IActionResult ClearAllFilters()
    {
        foreach (string column in FilterFields)
        {
            if (HttpContext.Session.TryGetValue(column, out byte[] savedJson))
            {
                HttpContext.Session.Remove(column);
            }
        }
        return Ok(true);
    }

Почему asp.net не соответствует этому?Мой URL-адрес / api / controller / action выглядит так, как будто он соответствует первому маршруту, который отображается при запуске.

1 Ответ

0 голосов
/ 28 сентября 2019

Вы смешиваете обычную маршрутизацию и маршрутизацию атрибутов :

Действия обычно маршрутизируются или атрибут маршрутизируются.Размещение маршрута на контроллере или действие делает его атрибут перенаправленным.Действия, которые определяют атрибутные маршруты, не могут быть достигнуты через обычные маршруты и наоборот. Любой атрибут маршрута на контроллере делает все действия в атрибуте контроллера перенаправленными.

Следующий вызов из вашего примера настраивает обычный шаблон маршрутизации:

config.MapRoute("Api","api/{controller}/{action}/{id?}");

Однако вы настроили GridFilterController на использование маршрутизации атрибута с помощью атрибута маршрутизации ([Route(...)]):

[Route("api/[controller]")]
[ApiController]
public class GridFilterController : ControllerBase

Для доступа к ClearAllFilters действие из /api/GridFilter/ClearAllFilters, у вас есть две общие опции:

  1. Измените шаблон маршрутизации атрибута на:

    [Route("api/[controller]/[action]")]
    

    Это означает, что имя действия будетбыть включенным как часть маршрута, который аналогичен настроенному вами шаблону обычной маршрутизации.

  2. Удалите атрибут [Route(...)] в целом.Однако это не идеально, так как вам также придется удалить атрибут [ApiController], поскольку для требуется маршрутизация атрибута .

...