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
相关产品推荐
相关产品推荐

