Обычная маршрутизация в ASP. NET Core API - PullRequest
4 голосов
/ 13 февраля 2020

Проблема:

Я создаю приложение API с NET Core 3.1. Я хотел бы избежать установки атрибута маршрута для каждого ApiControllers и действий. Я пробовал множество комбинаций на UseEndpoints для установки обычного маршрута, но у меня ничего не получается.

При некоторых настройках я не могу заставить работать Api, с некоторыми другими я получаю это исключение во время запуска:

InvalidOperationException: действие 'ApiIsWorking' не имеет атрибута route. Методы действий на контроллерах, аннотированных с помощью ApiControllerAttribute, должны быть перенаправлены по атрибуту.

Как настроить startup.cs на автоматическое сопоставление контроллеров с их именем класса и действий с именем их метода?

Спасибо!

Код:

startup.cs

...
services.AddControllers()
...

app.UseHttpsRedirection()
   .UseRouting()
   .UseAuthentication()
   .UseEndpoints(endpoints => ?? )
   .UseCoreHttpContext()
   .UseServerConfiguration();

controller.cs

[ApiController]
public class BaseAPI : ControllerBase 
{
        [HttpGet]
        public string ApiIsWorking()
        {
            return "API is working!";
        }
}

Решение:

Как говорит Реза Агаи в решении , ошибка заключалась в добавлении атрибута ApiController. После того, как я его удалил, команда UseEndpoints начала работать.

Моя ошибка заключалась в добавлении атрибута, чтобы иметь возможность распознавать, какие классы должны быть представлены через API. В этом не было необходимости, поскольку UseEndpoints отображают только классы, наследуемые от ControllerBase.

Предупреждение:

1) Обычная маршрутизация требует атрибута [FromBody] в действиях params.

2) Я выделяю ответ Зинова о проблемах обычной маршрутизации с Swashbuckle в. NET Core

Ответы [ 4 ]

4 голосов
/ 16 февраля 2020

Чтобы иметь обычную маршрутизацию для ваших контроллеров и действий, вам необходимо удалить атрибут [ApiController] и [Route] из вашего контроллера, а также действия и настроить маршрут в UseEndpoints.

Это уже упоминалось в документация :

Атрибут [ApiController] делает атрибут маршрутизации требованием.

Действия недоступны по обычным маршрутам , определенным UseEndpoints, UseMvc или UseMvcWithDefaultRoute в Startup.Configure.

Пример

Это рабочая настройка, которую я имею для запуска:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public IConfiguration Configuration { get; }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

И пример контроллера API:

public class ValuesController : ControllerBase
{
    // values/getall
    [HttpGet]
    public IEnumerable<string> GetAll()
    {
        return new string[] { "value1", "value2" };
    }

    // values/getitem/1
    [HttpGet]
    public string GetItem(int id)
    {
        return "value";
    }
}
2 голосов
/ 13 февраля 2020

РЕДАКТИРОВАТЬ:

Я попытался настроить его на моем компьютере. Когда я удалил атрибут Route из контроллера, я получил ошибку ниже:

InvalidOperationException: Действие 'WebAPISample.Controllers.WeatherForecastController.Index (WebAPISample)' не имеет маршрута атрибута. Методы действий на контроллерах, аннотированных с помощью ApiControllerAttribute, должны иметь атрибут перенаправления .

В самом сообщении об ошибке говорится, что контроллеры API должны использовать маршрутизацию атрибутов.

Я знаю, что это не отвечает на ваш вопрос, но с. NET Core 3 API, это кажется невозможным.

Из документации:

Атрибут [ApiController] делает атрибут маршрутизации требованием. Например:

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

Действия недоступны по обычным маршрутам, определенным UseMvc или UseMvcWithDefaultRoute в Startup.Configure.

См. эту страницу на MSDN.

1 голос
/ 16 февраля 2020

Вот мой совет, если вы идете по этому пути использования обычной маршрутизации с ядром. net. После того, как вы закончите sh реализацию API, вы добавите в него некоторую документацию. Люди обычно используют этот пакет nuget Swashbuckle.AspNetCore, который реализует более поздний стандарт OpenAPI (Swagger). Но вот проблема, когда вы используете обычную маршрутизацию и хотите создать документацию с помощью этого инструмента.

, если вы используете обычную маршрутизацию (в отличие от атрибутной маршрутизации), любые контроллеры и действия над те контроллеры, которые используют обычную маршрутизацию, не будут представлены в ApiExplorer, что означает, что Swashbuckle не сможет найти эти контроллеры и генерировать из них операции Swagger

Для получения дополнительной информации см. эту ссылку: Swashbuckle Надеюсь, это избавит вас от многих головных болей в будущем с документацией для вашего API

0 голосов
/ 13 февраля 2020

Вы пробовали это?

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...