Действие контроллера не вызывается в консольном приложении ASPNETCORE под управлением Kestrel - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы иметь консольное приложение, работающее на автономном веб-сервере, принимающем REST-вызовы. Мое приложение - это приложение. NET Core с ASP. NET Core внутри. Я совершенно новичок в этой области. Я нашел несколько примеров и теперь борюсь с конфигурацией маршрута контроллера. При использовании приведенного ниже кода я всегда получаю ошибку «404 Not Found» при использовании http://localhost: 3354 / api / Demo / Hello . У кого-нибудь есть идеи, что я делаю не так? Спасибо за любое предложение! Я использую VS2019 и ASPNETCORE 2.2.8.

class Program
{
    static void Main(string[] args)
    {
        var builder = WebHost.CreateDefaultBuilder()
            .ConfigureKestrel(options => options.ListenAnyIP(3354))
            .UseStartup<Startup>();

        builder.Build().Run();
    }
}

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

    public void Configure(IApplicationBuilder builder, IHostingEnvironment env)
    {
        builder.UseMvc(delegate(IRouteBuilder routeBuilder)
        {
            routeBuilder.MapRoute("default", "api/{controller}/{action}");
        });
    }
}

А вот и класс DemoController.

public class DemoController : Controller
{
    public IActionResult Hello()
    {
        return Ok("Hello world");
    }
}

This is how the solution looks.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

После некоторого исследования и сравнения моего проекта с образцом проекта Романа Калинчука я обнаружил, что проблема в том, что поставщик контроллера mvc не ищет типы контроллеров в моей сборке приложения. Достаточно добавить мою сборку приложения в коллекцию частей приложения. См. Строку .AddApplicationPart (typeof (DemoController) .Assembly); .

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvc()
            .AddApplicationPart(typeof(DemoController).Assembly);
    }

    public void Configure(IApplicationBuilder builder, IHostingEnvironment env)
    {
        env.EnvironmentName = "Development";

        builder.UseMvc(delegate(IRouteBuilder routeBuilder)
        {
            routeBuilder.MapRoute("test", "api/{controller}/{action}");
        });
    }
}
0 голосов
/ 17 июня 2020

Ваш пример у меня работает нормально. net core 2.2 Вы можете попробовать явно объявить маршруты, например

[ApiController]
[Route("api/[controller]")]
public class DemoController : Controller
{
    [HttpGet("hello")]
    public IActionResult Hello()
    {
        return Ok("Hello world");
    }
}

Также вы можете рассмотреть возможность использования встроенных шаблонов Visual Studio для веб-приложений api

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