After Publisihing Worker Service as Windows Service it keeps failing with the error: System.NullReferenceException
After Publisihing Worker Service as Windows Service it keeps failing with the error: System.NullReferenceException
worker 服务是 .net core 3.1,当我在 VS 2019(调试和发布)上 运行 它时它工作,但在 deploying/publishing 并使用 [=10= 安装它之后], 它一直失败并显示错误 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>();
});
}
worker 服务是 .net core 3.1,当我在 VS 2019(调试和发布)上 运行 它时它工作,但在 deploying/publishing 并使用 [=10= 安装它之后], 它一直失败并显示错误 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>();
});
}