如何解决在将 Worker 服务发布为 Windows 服务后,它一直失败并显示错误:System.NullReferenceException
worker 服务是 .net core 3.1,当我在 VS 2019 上运行它时它可以工作(调试和发布),但是在使用 sc.exe
部署/发布和安装它后,它一直失败并显示错误Object reference not set to an instance of an object
。
我已经检查过,我觉得唯一的一点是原因,可能来自 DI(不应该是,因为它在 VS 2019 上运行良好),还有 appsettings.json
和 appsettings.Development.json
包含在发布的文件中(所以我看不出为什么 IOptionsMonitor
或 IServiceScopeFactory
应该失败)
解决方法
默认情况下,在将工作服务安装为 windows 服务后,它会将运行所需的文件复制到 TEMP
文件夹中,如果您使用默认值 (sc
) 安装 LocalSystem
,具有文件夹模式 C:\WINDOWS\TEMP\.net\<executable-name>\<random-hash>\
。
而 appsetings.json
或任何设置文件不会复制到那里(请参阅 microsoft doc)。
因此需要将 IHostBuilder
或 IConfigurationBuilder
指向设置文件所在的位置(更有可能指向发布可执行文件的位置)。
我用以下代码解决了它(通过设置 IConfigurationBuilder
的基本路径):
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureAppConfiguration((hostContext,config) => {
// Ensure that the appsettings.json files are in same folder with the executable
string pathToExe = Process.GetCurrentProcess().MainModule.FileName;
string dir = Path.GetDirectoryName(pathToExe);
config.SetBasePath(dir);
})
.ConfigureServices((hostContext,services) =>
{
services.AddHostedService<Worker>();
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。