在应用程序中启动 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();
编辑:
我发现了这个问题:
我使用以下代码创建了一个控制台应用程序(基本上与答案中的相同,但有一些小改动):
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();