ASP.NET Core Web API运行遇500错误及Kestrel连接异常求助
错误核心信息
运行ASP.NET Core Web API时出现500内部服务器错误,输出窗口抛出以下异常:
Microsoft.AspNetCore.Server.Kestrel: Error: Connection id "0HN1QQK58NPAJ", Request id "0HN1QQK58NPAJ:00000001": An unhandled exception was thrown by the application.
System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it. (127.0.0.1:10809)
---> System.Net.Sockets.SocketException (10061): No connection could be made because the target machine actively refused it.
错误页面截图:
代码片段
Program.cs代码:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddNodeServices(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } ArvanStorage_ehsan_simin.AWSAccessKey = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("ArvanStorage:AWSAccessKey").Value; app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
问题原因
异常中的127.0.0.1:10809是NodeServices默认尝试连接的Node.js服务端口,出现"连接被主动拒绝"的原因集中在以下几点:
- 本地未安装Node.js,或Node.js未配置到系统环境变量,导致ASP.NET Core无法启动Node.js进程。
- NodeServices启动Node.js进程失败,端口10809未被监听,或进程启动后直接崩溃。
- 代码中误加了NodeServices引用但实际未使用,框架仍尝试连接不存在的Node服务。
解决方法
方法1:移除未使用的NodeServices
如果你的Web API不需要和Node.js服务交互,直接删除builder.Services.AddNodeServices();这一行,重新编译运行即可。这是最直接的修复方式,很多场景下开发者会误加该服务引用但未实际使用。
方法2:正确配置NodeServices(若确实需要使用)
如果业务依赖Node.js服务,按以下步骤操作:
- 确保本地已安装Node.js,执行
node -v验证安装状态,若未安装需先安装并将其路径添加到系统环境变量PATH。 - 自定义NodeServices配置,避免端口冲突或启动失败:
builder.Services.AddNodeServices(options => { // 指定Node.js可执行文件路径(环境变量未配置时使用) options.NodePath = @"C:\Program Files\nodejs\node.exe"; // 关闭调试模式,避免额外启动开销 options.LaunchWithDebugging = false; // 可根据需求设置工作目录、超时时间等其他参数 }); - 检查关联的Node.js脚本,确保无语法错误或运行时异常,避免Node进程启动后崩溃。
方法3:检查端口占用情况
使用命令行工具排查10809端口是否被其他进程占用:
- Windows:执行
netstat -ano | findstr :10809,若有结果,用taskkill /PID <进程ID> /F终止占用进程。 - Linux/macOS:执行
lsof -i :10809,然后用kill -9 <进程ID>终止占用进程。
额外优化建议
代码中读取配置的方式可简化,无需重新构建ConfigurationBuilder,直接使用已有的builder.Configuration:
ArvanStorage_ehsan_simin.AWSAccessKey = builder.Configuration.GetSection("ArvanStorage:AWSAccessKey").Value;
内容的提问来源于stack exchange,提问作者ehsanHB

