Worker Service正在寻找appsettings.json文件,但它在System32文件夹中而不是本地文件夹中。

10

我有一个 .Net Core 工作器服务,我将其作为 Windows 服务运行。该服务使用 appsettings.json 文件进行配置信息。在使用 SC CREATE 命令安装服务后,服务出现了故障。

在事件查看器中,我发现错误原因是无法找到文件 C:\Windows\System32\appsettings.json。我的服务文件位于不同的文件夹 c:\Services\ 中,但服务却在 System32 文件夹中寻找该文件。

以下是配置注册信息。

 var configBuilder = new ConfigurationBuilder()
                   .SetBasePath(Directory.GetCurrentDirectory())
                   .AddJsonFile("appsettings.json");
var configuration = configBuilder.Build();
            services.AddSingleton(configuration);

我该如何让服务查看本地文件夹?


你解决了这个问题吗,@ajith? - Max Medina
@MaxMedina 我成功解决了,但是使用的是标记为答案的那个。我使用了 Assembly.GetExecutingAssembly().Location。 - Ajith
4个回答

15

这是因为当前目录在运行时更改为 C:\Windows\System32。 您可以通过Assembly.GetExecutingAssembly()获取相对路径。例如:

var configBuilder = new ConfigurationBuilder()
    .SetBasePath( Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location))
    .AddJsonFile("appsettings.json");
var configuration = configBuilder.Build();

我尝试了这个,但是出现了错误。描述:由于未处理的异常,该进程已终止。异常信息:System.IO.DirectoryNotFoundException: C:\Services\MyAssemblyName.dll\ - Ajith
1
@Ajith 你是否像我一样使用了 Path.GetDirectoryName( )?还是使用了和我完全相同的代码?我测试了上面的代码,它对我来说运行良好。 - itminus
@itminus 我使用了和你的代码相同的代码。但是在EventViewer上仍然出现了相同的错误。你知道这个问题的其他可能原因吗? - Shailee Shah
@ShaileeShah 使用了上面itminus建议的解决方案。它使用了Assembly.GetExecutingAssembly().Location。 - Ajith
它对我也没用,但在事件日志中指出该程序集运行自'C:\ WINDOWS \ TEMP \ .net <AssemblyName> <weirdalphanum>'。这与MS文档中的内容相矛盾。 - Lincoln Pires

6

我已成功地使用了在Windows服务中托管ASP.NET Core文档。

简而言之,您只需在配置生成器步骤中添加.UseWindowsService(),就像以下代码一样:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureAppConfiguration((hostContext, configuration) => 
        {
            //...set your configurations here
        })
        .ConfigureServices((hostContext, services) =>
        {
            //...configure you services here
        }

2

我通过设置ContentRoot来实现了不同的解决方法。但是我正在使用Wix将服务安装到Windows。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Diagnostics;
using System.IO;

namespace ConverterService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            string pathToContentRoot = Path.GetDirectoryName(pathToExe);

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

        public static IHostBuilder CreateHostBuilder(string[] args, string contentRoot) =>
            Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .UseContentRoot(contentRoot)
                .ConfigureServices((hostContext, services) =>
                {
                    ConverterConfig config = hostContext.Configuration
                    .GetSection("ConverterConfig")
                    .Get<ConverterConfig>();

                    config.RootPath = contentRoot;

                    services.AddSingleton(config);
                    services.AddHostedService<WindowsBackgroundService>();
                });
    }
}


0
我发现当从一个 .Net 8 Windows 服务中调用时,Assembly.GetExecutingAssembly().Location(如其他答案中所建议的)返回了一个空字符串。对我来说,AppContext.BaseDirectory 才是有效的。source 问题中的代码需要做出以下更改:
var configBuilder = new ConfigurationBuilder()
    .SetBasePath(AppContext.BaseDirectory)
    .AddJsonFile("appsettings.json");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接