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

Asp.Net Core应用注册为Windows服务后启动立即停止如何解决?

问题原因结论

该问题大概率和URL读取逻辑直接相关,核心诱因是Windows服务的默认工作目录为C:\Windows\System32,而非你的应用程序发布目录。你直接双击运行exe时工作目录就是exe所在路径,能正常读取.config文件;但注册为服务运行时,找不到配置文件导致Config类初始化报错,未处理的异常直接让服务启动后立刻终止。

排查验证方法

打开Windows「事件查看器」→ 「Windows日志」→「应用程序」,查找来源为你的应用名称的错误日志,日志中会明确提示配置文件未找到、Config类初始化失败等具体报错信息,可以直接确认根因。

修复方案

1. 修正服务运行时的工作目录

在Program.cs的Main方法最开头添加以下代码,强制将工作目录切换为exe所在的发布目录:

using System.Diagnostics;
using System.IO;

public static void Main(string[] args)
{
    // 新增以下3行,放在CreateHostBuilder之前执行
    var exePath = Process.GetCurrentProcess().MainModule.FileName;
    var directoryPath = Path.GetDirectoryName(exePath);
    Directory.SetCurrentDirectory(directoryPath);

    CreateHostBuilder(args).Build().Run();
}

修改后重新发布,更新服务的exe文件后重启服务,就能正常读取同目录下的.config文件。

2. 更规范的外部URL配置方案(推荐)

建议直接使用ASP.NET Core自带的配置系统读取URL,无需自定义Config类,兼容多场景配置来源:

  • 首先在发布目录的appsettings.json中添加URL配置:
{
  "Urls": "https://0.0.0.0:5001;http://0.0.0.0:5000"
}
  • 然后删掉ConfigureWebHost中手动调用UseUrls的代码即可,ASP.NET Core默认会自动读取appsettings.json、环境变量、命令行参数中的Urls配置项,无需手动处理。

如果需要注册服务时直接指定URL,也可以在创建服务时直接加命令行参数:

sc.exe create MyService binPath= "some\path\to\publish\to\MyService.exe --urls https://0.0.0.0:5001;http://0.0.0.0:5000"

额外注意事项

  • 如果使用HTTPS,需要确认服务运行的身份(默认是Local System)有读取对应SSL证书的权限
  • 确认配置的端口没有被其他进程占用

内容的提问来源于stack exchange,提问作者T H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:48:03