Добавьте конечную точку контроллера веб-API в рабочий проект Kestrel.

У меня есть рабочий проект .NET Core с конвейерами TCP, и я хочу добавить к нему одну конечную точку контроллера HTTP. я в основном

  • создал новый рабочий проект (для целей воспроизведения)
  • в его файле csproj я добавил <FrameworkReference Include="Microsoft.AspNetCore.App" /> в группу элементов, чтобы получить доступ к материалам веб-конструктора.
  • установил пакет Microsoft.AspNetCore.Mvc.Core
  • создал класс Startup

.

internal class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(); // not sure if I even need this
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder applicationBuilder)
    {
        applicationBuilder.UseRouting();
        applicationBuilder.UseEndpoints(endpoints => { endpoints.MapControllers(); });
    }
}
  • настроил Kestrel в классе Program

.

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webHostBuilder =>
            {
                webHostBuilder.UseKestrel(kestrelServerOptions =>
                {
                    kestrelServerOptions.ListenLocalhost(5000); // this will be a config value
                }).UseStartup<Startup>();
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}
  • создал контроллер для тестирования

.

[ApiController]
[Route("[controller]")]
internal class UsersController : ControllerBase
{
    [HttpGet]
    public async Task<ActionResult> Test()
    {
        return Ok();
    }
}
  • Я запускаю проект и вызываю GET http://localhost:5000/users
  • Я ожидал 200, но получил 404, и отладчик не попал в конечную точку контроллера.

Кто-нибудь знает, что мне не хватает?


person Olaf Svenson    schedule 01.10.2020    source источник
comment
Попробуйте и HTTP, и HTTPS. S является безопасным режимом и использует TLS для аутентификации. Обычно вы получаете ошибку 500, если TLS неверен. Ошибка 404 не найдена, но если сервер игнорирует HTTP и требует HTTPS, это может объяснить ошибку 404. HTTP по умолчанию использует либо порт 80, либо 8080.   -  person jdweng    schedule 01.10.2020
comment
Не могли бы вы изменить модификатор доступа к контроллеру на общедоступный и проверить? Решит ли это вашу проблему?   -  person Sergey Nazarov    schedule 01.10.2020
comment
@SergeyNazarov, черт возьми, изменение на общедоступное исправило :)   -  person Olaf Svenson    schedule 01.10.2020
comment
@OlafSvenson Это правильный способ добавить конечную точку HTTP в рабочий проект?   -  person Hary    schedule 27.03.2021


Ответы (2)


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

[ApiController]
[Route("[controller]")]
   public class UsersController : ControllerBase
    {
     [Route("")]
     [HttpGet]
     public async Task<ActionResult> Test()
       {
          return Ok();
       } 
    }

И во-вторых, сделать контроллер общедоступным

person Muhammad Aqib    schedule 01.10.2020
comment
Вам не нужен [Route("")]. Проблема в модификаторе доступа internal. Вторая часть вашего ответа верна. - person John H; 01.10.2020

Попробуйте ConfigureKestrel вместо метода конфигурации UseKestrel.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("cert.pfx", "password");
        });
})
person svyatis.lviv    schedule 01.10.2020