在应用程序中启动 C# web API

Start a C# web API inside an application

编辑:

我发现了这个问题: 所以我试着用它做点什么。

我使用以下代码创建了一个控制台应用程序(基本上与答案中的相同,但有一些小改动):

public class Program
{
    public static void Main(string[] args)
    {
        StartServer(args);
    }

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

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

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseEndpoints(configure => configure.MapControllers());
    }
}

public class MyEndpoint : ControllerBase
{
    [Route("")]
    public string Get()
    {
        return "it works";
    }
}

这很好用。如果我从另一个项目(另一个控制台应用程序)调用 StartServer 方法,它仍然有效。

但后来我用新的 .NET 6 样式替换了代码:

public class Program
{
    public static void Main(string[] args)
    {
        StartServer(args);
    }

    public static void StartServer(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.Services.AddControllers();
        builder.Services.AddEndpointsApiExplorer();

        var app = builder.Build();

        app.UseRouting();
        app.MapControllers();
        app.Run();

    }
}

public class MyEndpoint : ControllerBase
{
    [Route("")]
    public string Get()
    {
        return "it works";
    }
}

如果我从它自己的项目启动服务器,那是可行的,但如果它是从其他控制台应用程序启动的,则不再(404 错误)。

我错过了什么?

========== 原文 POST ==========

我目前正在学习 C# 中的 Web 开发,特别是尝试制作一个 C# REST API,它可以从 .NET 6 中的另一个程序集访问和启动。

如果您需要更多上下文:所有这一切背后的想法是向现有的大型程序添加一个网络 API。 API 将有一个 class 保存从应用程序接收的数据,并作为请求响应发送给 API 客户端。

这是我试过的:

首先,我使用 Visual Studio 2022 模板创建了一个 Web API 项目,将其输出类型设置为“Class Library”而不是“Console Application”,然后将它的所有 Program.cs 内容都在单独的 class(“Starter.cs”)和静态方法(“Start”)中。然后,我创建了一个单独的控制台应用程序,引用了 API 项目,并调用了 Starter.Start 方法。

服务器实际启动:它在控制台输出中可见,我可以使用浏览器访问它。

问题是我只有一个空白页面,当我尝试访问 URL 时根本没有调用控制器,否则当 API 它作为控制台应用程序启动时可以正常工作.

有什么我想念的吗?以这种方式启动应用程序时未读取的配置文件(appsettings.json?)? 或者这是实现我想要实现的目标的愚蠢方式?如果是这样,请不要犹豫,告诉我一个更好的解决方案,正如我所说,我只是在学习网络,所以我还没有真正 understand/know 所有好的实践和架构的注意事项。

这是我修改的代码,几乎没有。

Program.cs 中的代码(现已删除):

namespace WebApplication1
{
    public class Starter
    {
        public static void Start(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.Services.AddControllers();

            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
}

以及我如何在控制台应用程序中调用它:

WebApplication1.Starter.Start(args);

之后有一个 Console.ReadLine(); 来防止应用程序关闭。

其余部分与 .NET 6 中的 Visual Studio 2022 Web API 项目模板中的代码基本相同。

ms 推荐此语法用于 net 6 minimal api https://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0

app.MapGet("/MyEndpoint", () =>
{
   return "it works";
});

例如,当我从 Visual Studio 测试它们时,我在我的 apis 中使用它,因为我不喜欢空白屏幕。

一开始我改launchSettings.json

....
"launchUrl": "welcome",
"applicationUrl": "http://localhost:5000",
....

这是我的欢迎码


app.MapGet("/welcome", () =>
{
  var con = "<html><body><h1>Hello!</h1><p> <h3>  API Is Ready To Work!!! </h3> </p></body></html>";
  
  return Results.Content(con, "text/html");
});

app.Run();