.NET6下主控控制台启动WebAPI无法监听端口的问题
问题:主控控制台无法启动WebAPI并监听指定端口
我正在构建基于.NET 6的C# WebAPI、Blazor前端和控制台项目,计划用一个独立的主控控制台应用启动所有项目。现在先处理WebAPI部分,把标准的WeatherController模板WebAPI改成类库后,通过主控项目启动时无法访问API,检查发现服务没有监听appsettings.json配置的端口。
主控项目代码
internal class Program { private static async Task Main(string[] args) { await Run(args); } private static async Task Run(string[] args) { try { Startup webAPI = new Startup(); } catch (Exception e) { } } }
WebAPI项目Startup类代码
public class Startup { WebApplication app; public Startup() { var builder = WebApplication.CreateBuilder(); // Add services to the container builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } 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.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); } }
解决方法
核心问题分析
app.Run()是同步阻塞调用,在构造函数中调用会导致主控项目主线程被卡死,且空catch块直接吞掉了所有启动异常,无法排查问题。- 没有加载WebAPI项目的
appsettings.json配置文件,导致服务使用默认端口或无法读取你指定的端口。 - 在构造函数中启动服务不符合ASP.NET Core的异步生命周期规范。
具体修改步骤
1. 重构WebAPI的Startup类,改用异步启动方法
将启动逻辑从构造函数移到异步方法中,同时确保加载正确的配置文件:
public class Startup { private WebApplication _app; public async Task StartAsync() { var builder = WebApplication.CreateBuilder(); // 加载WebAPI的配置文件(如果主控项目与WebAPI不在同一目录,需指定完整路径) builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); // 保留原有服务注册逻辑 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); _app = builder.Build(); // 保留原有请求管道配置 if (_app.Environment.IsDevelopment()) { _app.UseSwagger(); _app.UseSwaggerUI(); } _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.UseHttpsRedirection(); _app.UseAuthorization(); _app.MapControllers(); // 用异步方法启动服务,避免阻塞主线程 await _app.RunAsync(); } // 添加停止方法,方便主控项目控制服务生命周期 public async Task StopAsync() { if (_app != null) { await _app.StopAsync(); } } }
2. 修改主控项目代码,异步启动WebAPI并处理异常
不要忽略启动过程中的异常,确保异步调用启动方法:
internal class Program { private static async Task Main(string[] args) { await Run(args); } private static async Task Run(string[] args) { try { Startup webAPI = new Startup(); // 异步启动WebAPI await webAPI.StartAsync(); } catch (Exception e) { // 打印异常信息,方便调试 Console.WriteLine($"启动WebAPI失败:{e.Message}"); Console.WriteLine(e.StackTrace); } } }
3. 确认配置文件与端口设置
确保WebAPI的appsettings.json中有正确的端口配置,并且该文件被复制到主控项目的输出目录:
{ "Urls": "http://localhost:5000;https://localhost:5001", "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
(右键WebAPI项目的appsettings.json→属性→复制到输出目录:选择“如果较新则复制”或“始终复制”)
这样修改后,主控项目就能正确启动WebAPI并监听指定端口,同时能捕获启动过程中的异常便于调试。
内容的提问来源于stack exchange,提问作者yetanothercoder
相关产品推荐
相关产品推荐

