Add Web API controller endpoint to Kestrel worker project
Asked Answered
C

2

3

I have a .NET Core worker project with TCP pipelines and want to add one HTTP controller endpoint to it. I basically

  • created a new worker project (for reproduction purposes)
  • in its csproj file I added <FrameworkReference Include="Microsoft.AspNetCore.App" /> to the item group to gain access to the webbuilder stuff
  • installed the package Microsoft.AspNetCore.Mvc.Core
  • created a Startup class

.

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(); });
    }
}
  • configured Kestrel in the Program class

.

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>();
            });
}
  • created a controller for testing purposes

.

[ApiController]
[Route("[controller]")]
internal class UsersController : ControllerBase
{
    [HttpGet]
    public async Task<ActionResult> Test()
    {
        return Ok();
    }
}
  • I run the project and call GET http://localhost:5000/users
  • I would expect a 200 but get a 404 and the debugger does not hit the controller endpoint

Does someone know what I'm missing?

Circumambient answered 1/10, 2020 at 11:54 Comment(4)
Try both HTTP and HTTPS. The S is secure mode and uses TLS for authentication. Usually you would get a 500 error if TLS is wrong. Error 404 is not found but if server ignores the HTTP and need HTTPS than that could explain the 404 error. HTTP defaults to either port 80 or 8080.Frumpish
Could you change controller access modifier to public and check? Will it solve your problem?Pulley
@SergeyNazarov oh damn, changing it to public fixed it :)Circumambient
@OlafSvenson Is this the right way to add HTTP endpoint to a worker project?Firer
I
3

You need to specify the default route on method if you want this to be work

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

And Second thing is make the controller public

Iciness answered 1/10, 2020 at 12:14 Comment(1)
You don't need the [Route("")]. It's the access modifier being internal that's the problem. The second part of your answer is correct.Mandy
S
0

Try ConfigureKestrel instead of UseKestrel configuration method

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("cert.pfx", "password");
        });
})
Sukkah answered 1/10, 2020 at 12:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.