Маршрутизация не работает с собственным веб-API

По сути, это то, что у меня есть, очень простой набор из трех файлов со свежим ядром asp.net 2.1 (фактически скопировано из руководств):

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Затем идет самый простой стартап

class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }
}

И контроллер значений по умолчанию

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

Независимо от того, что я называю, я вижу в консоли ту же ошибку 404:

Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/values
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 105.0181ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/values
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 2.6016ms 404
etc

Я попытался добавить маршрут по умолчанию как с app.UseMvcWithDefaultRoute();, так и указать его вручную. Я попытался удалить атрибуты маршрута, когда использовал маршрут по умолчанию. Также пробовал добавить AddControllersAsServices(). Но результат все тот же - 404. Когда я настраиваю пользовательский обработчик в app.Run, он работает без проблем.


csproj (я заменил зависимость Microsoft.AspNetCore.All по умолчанию, но маршрутизация по-прежнему не работает)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.0" />
  </ItemGroup>

</Project>

person Sergey Berezovskiy    schedule 31.05.2018    source источник


Ответы (3)


Это было довольно сложно отследить, но проблема сводится к следующему в вашем .csproj:

<Project Sdk="Microsoft.NET.Sdk">

Когда вы создаете веб-приложение, вам необходимо вместо этого ссылаться на Web Sdk, как показано ниже:

<Project Sdk="Microsoft.NET.Sdk.Web">

Мне удалось воспроизвести и исправить вашу проблему с помощью этого небольшого изменения.

person Kirk Larkin    schedule 01.06.2018

Мне помогло добавление AddApplicationPart после AddMvc вот так:

.AddMvc()
.AddApplicationPart(typeof(Startup).Assembly)
person user2959372    schedule 25.07.2018
comment
Мне интересно. Согласно документации (docs. microsoft.com/en-us/aspnet/core/mvc/advanced/), насколько я понимаю, вы используете AddApplicationPart () для повторного использования контроллеров, бритвенных страниц и т. д. из других сборок, не так ли? Зачем нужно использовать это для контроллеров в одной сборке. Не могли бы вы объяснить? - person Sreejith Krishnadas; 29.09.2019
comment
Интересно, что вызов этого метода был необходим только на моей Linux-машине (Ubuntu 18.04). Под окнами контроллеры были найдены автоматически. - person Andi; 29.01.2020
comment
Это меня спасло! Мне также было бы интересно объяснить, зачем это нужно ... - person Philip Atz; 15.12.2020

вы можете попробовать изменить код на это:

[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    [Route("api/values")]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

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

тогда для звонка вы можете использовать:

'localhost: 5000 / api / значения'

person henoc salinas    schedule 31.05.2018
comment
Извините, пробовал как указать маршрут в HttGet, в отдельном атрибуте Route, так и удалить все атрибуты с маршрутизацией по умолчанию - та же история - person Sergey Berezovskiy; 01.06.2018