从控制台项目启动ASP.NET Core Web API异常:无控制器、端口不符
核心问题总结
你遇到的空白服务、默认端口、无控制器和Swagger不可用的问题,本质是主项目启动的是一个全新的空ASP.NET Core服务,而非你开发的WebApi项目实例,导致WebApi的配置、控制器注册、Swagger配置都没有被执行。
具体原因及修复方案
1. 未复用WebApi项目的启动逻辑
主项目如果直接调用WebApplication.CreateBuilder()创建服务,会生成一个默认的空服务,完全没有加载你在WebApi项目中配置的控制器、Swagger等组件。
修复方法:
复用WebApi项目的启动入口,而不是重新创建空服务:
- 首先确保主项目已添加对WebApi项目的项目引用(右键主项目→添加→项目引用→勾选WebApi项目)。
- 修改主项目的启动逻辑,直接调用WebApi项目的启动逻辑:
WebApi项目Program.cs(调整为可复用结构):
namespace WebApiDemo; // 封装启动逻辑,方便外部调用 public static class WebApiHost { public static void Start(string[] args) { var builder = WebApplication.CreateBuilder(args); // 你的WebApi原有配置 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(); } } // 保留原Main方法,供IDE直接启动WebApi用 public class Program { public static void Main(string[] args) => WebApiHost.Start(args); }
主项目Program.cs:
using System.Threading; using WebApiDemo; // 引用WebApi项目的命名空间 var apiThread = new Thread(() => { // 传递启动参数,比如指定端口(替代launchSettings的配置) string[] apiArgs = new[] { "--urls=http://localhost:5001" }; WebApiHost.Start(apiArgs); }); apiThread.IsBackground = true; // 设置为后台线程,避免主进程退出时阻塞 apiThread.Start(); Console.WriteLine("WebApi已启动,按回车退出..."); Console.ReadLine();
2. 配置文件未正确加载
launchSettings.json是IDE启动时使用的配置文件,代码启动WebApi时不会自动读取该文件,所以你在launchSettings中配置的端口不会生效。另外如果WebApi的appsettings.json未设置复制到输出目录,也会导致配置丢失。
修复方法:
- 对于端口配置:通过启动参数
--urls指定(如上例),或者在WebApi的appsettings.json中添加"Urls": "http://localhost:5001",确保appsettings.json设置为复制到输出目录(右键文件→属性→复制到输出目录:如果较新则复制)。 - 如需加载launchSettings.json的配置,可手动添加配置源(不推荐,因为launchSettings是IDE专用):
builder.Configuration.AddJsonFile("launchSettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"launchSettings.{builder.Environment.EnvironmentName}.json", optional: true);
3. 控制器与Swagger未被注册
如果主项目未引用WebApi项目的程序集,ASP.NET Core的控制器发现机制无法找到WebApi中的控制器;同时Swagger的配置代码仅在WebApi的启动逻辑中,主项目启动空服务时自然不会执行。
修复方法:
通过复用WebApi的启动逻辑(见第1点),即可自动执行控制器注册和Swagger配置,无需额外操作。
验证要点
启动后查看日志,若出现以下内容则说明修复成功:
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'WebApiDemo.ValuesController.Get (WebApiDemo)'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'WebApiDemo.ValuesController.Get (WebApiDemo)'
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request finished HTTP/1.1 GET http://localhost:5001/api/values - - - 200 - application/json;+charset=utf-8 12.345ms
访问http://localhost:5001/swagger可看到Swagger界面。
内容的提问来源于stack exchange,提问作者Simon

