【问题标题】:Controller's action not invoked in ASPNETCORE console app running Kestrel在运行 Kestrel 的 ASPNETCORE 控制台应用程序中未调用控制器的操作
【发布时间】:2020-06-17 21:01:48
【问题描述】:

我想要一个控制台应用程序运行一个接受 REST 调用的独立网络服务器。我的应用程序是一个带有 ASP .NET Core 的 .NET Core 应用程序。我在这个领域是全新的。我找到了一些例子,现在我在控制器路由配置上苦苦挣扎。使用下面的代码,我在使用http://localhost:3354/api/Demo/Hello 时总是会收到“404 Not Found”错误。有谁知道我做错了什么?感谢您的任何建议! 我使用 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");
    }
}

【问题讨论】:

    标签: asp.net-core rest


    【解决方案1】:

    您的示例在 .net core 2.2 上对我来说效果很好 你可以尝试明确声明像

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

    您也可以考虑使用 api web 应用程序的 Visual Studio 内置模板

    【讨论】:

    • 嗯,即使没有 DemoController 类的任何属性,它也能正常工作吗?我在想我的项目和你的项目有什么区别。你愿意和我分享你的 VisualStudio 项目吗?不知何故?
    • @Rexxowski 试试看github.com/Ezergil/TestApp1
    • 非常感谢您分享您的项目!现在我可以看到区别了。我的项目是一个纯控制台 exe 应用程序,而您的项目则配置为在 IIS Express 下运行。这种差异让我坚信 mvc 控制器提供程序不会在我的控制台应用程序程序集中寻找控制器。这是真的。请参阅下面的答案。
    【解决方案2】:

    在对我的项目与 Roman Kalinchuk 的示例项目进行一些调查和比较后,我发现问题在于 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}");
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2011-01-22
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多