You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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();
    }
}

解决方法

核心问题分析

  1. app.Run()是同步阻塞调用,在构造函数中调用会导致主控项目主线程被卡死,且空catch块直接吞掉了所有启动异常,无法排查问题。
  2. 没有加载WebAPI项目的appsettings.json配置文件,导致服务使用默认端口或无法读取你指定的端口。
  3. 在构造函数中启动服务不符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:50:30